Obiektowe - problem z dziwnymi znaczkami
Ostatnio zmodyfikowano 2011-06-23 21:24
Ziemowit |
Można to zawsze zrobić tak. » 2011-06-17 22:50:15 Edytuję post gdyż oczywistej oczywistości nie zauważyłem...
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)
class Smok { private: int wielkosc; char kolor[ 100 ]; 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; }
Smok smok1; Smok smok2( "Bury", 120 );
b) Dynamiczna alokacja. Ale nie wiem czy wiesz, co to więc nie rozwijam ;)
|
|
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? |
|
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 :) |
|
malan |
» 2011-06-23 08:45:02 Istnieje jeszcze coś takiego jak dynamiczna alokacja i std::string :) |
|
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ć :) |
|
michalp |
» 2011-06-23 21:24:17 Może najpierw zacznijcie od list inicjalizacyjnych. |
|
1 « 2 » |