wskaźniki a tablice char w klasach

0

Witam. Zaczynam przygodę z C++ i utknąłem niestety na wskaźnikach. Chciałbym stworzyć klasę z tablicą char jako jej atrybut, oraz metodą liczącą długość napisu wprowadzonego do tego atrybutu. Na obiekt utworzony na podstawie klasy ma zostać ustawiony wskaźnik. Przez ten wskaźnik chciałbym wprowadzić jakiś napis do tablicy char, a później odwołać się do metody zliczającej ilość znaków. Pewnie robię masę błędów, więc prosiłbym o konstruktywną krytykę i nakierowanie mnie na właściwy tor ;)

 
#include <iostream>
//wlasna funkcja strlen
#define N 20

class Napis
{
public:
    char napis[N];

    int strlen(char*, int);
    Napis(char,int);
};
Napis::Napis(char napis, int N){napis[N] = "brak";}

Napis::strlen(char *p, int rozmiar)
{
    int len=0;
    while (*p)
    {
        len++;
        p++;
    }
    return len;
}

int main()
{
    Napis obiekt1;
    Napis *wsk=&obiekt1;
    wsk->napis="abcdef";
    int x = wsk->strlen(napis,N);
    std::cout<<"napis ma: "<<x<<" znakow.";
}

edit:
To przypisanie wsk do x tez jest bez sensu, chcę tylko zobrazować o co mi chodzi.

2

teraz pytanie, czy chcesz sie uczyc C czy C++ jezeli C++ zapomnij o tym zadaniu. Masz od tego std::string zeby sprawdzic dlugosc napisu i masz smart pointery by sie nie bawic wskaznikami.

0

Fasadin znam std::string niestety prowadzący zajęcia używa tablic char, nie pytaj dlaczego, tego nie wiem ;p

0
 Napis::Napis(char napis, int N){napis[N] = "brak";}
  1. chyba char *napis, aczkolwiek nie mam pewności, bo to co robisz we wnetrzu wskazuje, że char **napis chiałeś w konstruktorze mieć....
  2. odpowiedz mi na pytanie: co chesz uzyskać tą operacją:
napis[N] = "brak"; 

bo ja się obawiam, że tu czaja się conajmniej 3 błedy z mozliwym wyjściem po za pamięć włącznie, ale najpierw odpowiedź...
A jeśli nie wiesz, co tu tak na prawdę zostanie wykonane, należy wrócić do poprzednich lekcji i je powtórzyć.

0

... właśnie zauważyłem coś od czego bolą oczy...

napis[N]="brak"; 

czy według ciebie jeden znak może pomieścić cały wyraz?
podejrzane...

1
#include <iostream>
#include <cstdlib>

class Napis
{
public:
 	Napis(const char * napis = NULL);
    size_t strlen() const;
    Napis& operator=(const char * napis);
private:
	const char * napis;
};

Napis::Napis(const char * napis) : napis(napis){
}

size_t Napis::strlen() const {
	const char * p = napis;
	while(*p++);
	return ((p - napis) / sizeof(napis[0])) - 1;
}

Napis& Napis::operator=(const char * napis) {
	this->napis = napis;
}

int main()
{
    Napis napisik1;
    napisik1 = "Ala ma kota a ten kot to idiota.";
    std::cout << "napis ma: " << napisik1.strlen() <<" znakow.\n";
    
    Napis napisik2("Ala ma kota czy kot ma Alę? Nikt nie wie wcale.");
    std::cout << "napis ma: " << napisik2.strlen() << " znaków.\n";
}

Tylko nie wiem po co tyle klepać bo zysku z tego żadnego a problemów wiele. Tu klasa nie opiekuje się samym napisem, tylko na niego wskazuje swoim atrybutem. O to chodziło ? :-/

0
kaczus napisał(a):

bo ja się obawiam, że tu czaja się conajmniej 3 błedy z mozliwym wyjściem po za pamięć włącznie, ale najpierw odpowiedź...

Chcialem w konstruktorze miec cala tablice char[] nie dopatrzylem i dalem sam char. Po wstawieniu napisu brak do tablicy wolne miejsce zostanie zastapione znakami null wiec pamiec zostanie zmarnowana ale chodzilo mi tylko o funkcjonowanie.

0

@mariusz_s w opisany sposób nie wstawisz do tablicy napisu - poszukaj informacji o strcpy.

0

Doczytałem co nieco o łańcuchach znakowych ze starego C i udało mi się rozwiązać problem. Nie zmienia to faktu, że lepiej byłoby użyć klasy string. Dzięki za uwagi i pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1