Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Obiektowe - problem z dziwnymi znaczkami

Ostatnio zmodyfikowano 2011-06-23 21:24
Autor Wiadomość
Ziemowit
Można to zawsze zrobić tak.
» 2011-06-17 22:50:15
Edytuję post gdyż oczywistej oczywistości nie zauważyłem...

C/C++
class Smok
{
private:
    int wielkosc;
    char * kolor;
public:
    Smok( char * a_kolor = "zielony", int a_wielkosc = 260 );
    void wiezi_ksiezniczke();
   
};

Nie da się tak zrobić jak chcesz gdyż.

char * kolor to wskaźnik. Wskaźnik nie alokuje Ci automatycznie pamięci. To wskaźnik na pamięć której jeszcze nie zaalokowałeś... Aby CI działało musisz zrobić tak:

a)

C/C++
class Smok
{
private:
    int wielkosc;
    char kolor[ 100 ]; // tablica. Od razu masz miejsca na 100 elementów.
public:
    Smok( char * a_kolor = "Zielony", int a_wielkosc = 260 );
    void wiezi_ksiezniczke();
   
};

Smok::Smok( char * a_kolor, int a_wielkosc )
{
    strcpy( kolor, a_kolor );
    wielkosc = a_wielkosc;
}

// Powyższe rozwiązanie daje następujące możliwości

Smok smok1; // utworzy smoka z domyślnymi wartościami kolor = "Zielony" wielkosc=260
Smok smok2( "Bury", 120 ); // utworzy smoka o parametrach podanych do konstruktora
b) Dynamiczna alokacja. Ale nie wiem czy wiesz, co to więc nie rozwijam ;)
P-34236
malan
» 2011-06-20 23:24:28
char * kolor to wskaźnik. Wskaźnik nie alokuje Ci automatycznie pamięci. To wskaźnik na pamięć której jeszcze nie zaalokowałeś...
Co w związku z tym?
P-34378
Ziemowit
» 2011-06-21 12:49:42
Jest to złe rozwiązanie które prędzej czy później się zemści.

Jeśli w konstruktorze zrobimy coś takiego:

char * kolor = "zielony";

To wszystkie kolory stworzonych smoków będą odwoływać się de facto do jednego i tego samego adresu.

Ponieważ przy tym zapisie wskaźnik na char - kolor zapamiętuje adres początku słowa ciągu znaków "zielony". Ciąg ten jako, że jest wpisany na sztywno staje się stałą łańcuchową zapamiętaną w miejscu pamięci której nie możemy zmieniać.

Mając na uwadze dalsze działania jakie można zrobić z klasą jest to złe rozwiązanie. Jak widzę char * kolor nie jest wskaźnikiem typu const. Więc może kiedyś zmienić to na co będzie wskazywał. Jeśli dalej pójdziemy tym stylem to w przypadku operatora przypisania czy kopiowania jednego obiektu do drugiego będzie katastrofą. Oczywiście możemy nie kopiować koloru itp. Można się tak długo spierać. Ale wydaje mi się, że od razu powinno się robić to jak należy. Oczywiście mogę się mylić ;)

Ale rozumiem, że się źle wyraziłem i o to chyba chodzi. Da się tak zrobić tylko moim zdaniem nie do końca jest to zrobione dobrze :)
P-34387
malan
» 2011-06-23 08:45:02
Istnieje jeszcze coś takiego jak dynamiczna alokacja i std::string :)
P-34466
Ziemowit
» 2011-06-23 18:42:15
Tylko chyba warto, aby kolega sobie to przerobił i na tablicach i na dynamicznej alokacji i za pomocą klasy string. Wtedy chyba najwięcej się nauczy. Jeśli od razu zacznie korzystać z klasy string nie rozumiejąc jak to działa niewiele się nauczy :)

Tak mi się wydaje.

A dynamiczną alokacją też powinien się kolega zainteresować. Prędzej czy później będzie musiał z niej korzystać :)
P-34501
michalp
» 2011-06-23 21:24:17
Może najpierw zacznijcie od list inicjalizacyjnych.
P-34524
1 « 2 »
Poprzednia strona Strona 2 z 2