burn3ov Temat założony przez niniejszego użytkownika |
konstrukcja obiektu, którego składnikiem jest obiekt innej klasy » 2024-07-21 16:04:31 Mamy grę snake z klasami Game, Tsnake i Tfood. Konstruktor Tsnake.h wygląda tak: Tsnake( Tfood * f, Tdirection = Tdirection::right ) czyli wąż dostaje obiekt Tfood, którym się interesuje zaś klasa Game tak: class Game : public Tsnake , Tfood { bool gameOver; Tfood food; Tsnake waz; public: Game(); void GetInput(); void Draw(); };
i teraz jak zainicjalizować obiekt Tsnake na liście inicjalizacyjnej klasy Game? |
|
DejaVu |
» 2024-07-21 16:06:12 GPT 4o: Aby zainicjalizować obiekt `Tsnake` na liście inicjalizacyjnej klasy `Game`, musisz skorzystać z listy inicjalizacyjnej w konstruktorze `Game`. Ponieważ konstruktor `Tsnake` przyjmuje wskaźnik do obiektu `Tfood` oraz opcjonalny argument typu `Tdirection`, musisz przekazać odpowiednie wartości w liście inicjalizacyjnej. Zakładając, że masz odpowiednio zdefiniowane wartości dla `Tfood` i `Tdirection`, konstruktor klasy `Game` może wyglądać tak: class Game : public Tsnake , public Tfood { bool gameOver; Tfood food; Tsnake waz; public: Game() : waz( & food, Tdirection::right ) { gameOver = false; } void GetInput(); void Draw(); };
W powyższym przykładzie, obiekt `waz` typu `Tsnake` jest inicjalizowany przy użyciu obiektu `food` typu `Tfood` oraz wartości `Tdirection::right`. Lista inicjalizacyjna zapewnia, że obiekt `waz` jest poprawnie skonstruowany przed wykonaniem ciała konstruktora `Game`. Jeśli `Tdirection::right` jest domyślną wartością w konstruktorze `Tsnake`, można go pominąć: class Game : public Tsnake , public Tfood { bool gameOver; Tfood food; Tsnake waz; public: Game() : waz( & food ) { gameOver = false; } void GetInput(); void Draw(); };
W ten sposób, obiekt `waz` zostanie poprawnie zainicjalizowany przy użyciu obiektu `food` bez potrzeby przekazywania drugiego argumentu, jeśli jego wartość domyślna jest wystarczająca. |
|
DejaVu |
» 2024-07-21 16:09:01 W każdym razie macie jakiś dziwny koncept klasy Game, która dziedziczy po Tsnake i Tfood. Raczej czegoś nie zrozumieliście z dziedziczeniem i jego zastosowaniem, skoro takie konstrukcje robicie. |
|
burn3ov Temat założony przez niniejszego użytkownika |
» 2024-07-21 16:31:20 Faktycznie masz rację ta konstrukcja nie ma sensu o co innego mi chodziło. Zrobiłem wszystkie klasy i teraz chcę to wszystko jakoś scalić. Aczkolwiek kompilator dalej wyświetla błąd:
Błąd C2512 "Tsnake": niedostępny odpowiedni konstruktor domyślny
|
|
DejaVu |
» 2024-07-21 16:40:16 Jedyne co da się napisać na podstawie tego co wkleiłeś, to: "kompilator napisał Ci jaki jest problem". |
|
tBane |
» 2024-07-21 17:22:20 Po prostu nie dziedzicz po Tfood i Tsnake. I twórz instancje obiektów food oraz waz w konstruktorze gry class Game { bool gameOver; Tfood food; Tsnake waz; public: Game() { food = Tfood(); waz = Tsnake(); gameOver = false; } void GetInput(); void Draw(); };
|
|
burn3ov Temat założony przez niniejszego użytkownika |
» 2024-07-21 21:00:08 Dzięki właśnie o coś takiego mi chodziło. Jednak w książce mam taki zapis "Obiekt jakiejś klasy będący składnikiem innej klasy może być inicjalizowany jedynie za pomocą listy inicjalizacyjnej. Nie można próbować uruchomić konstruktora takiego obiektu składowego później, czyli z wnętrza konstruktora klasy, w której obiekt ten się zawiera. Wtedy jest już za późno" Czy to nie jest sprzeczne z zapisem powyżej? |
|
pekfos |
» 2024-07-21 22:35:03 Nie jest sprzeczne, bo to nie jest inicjalizacja, tylko przypisanie wartości po inicjalizacji. food i waz są inicjalizowane ich konstruktorami domyślnymi, a przypisania są nadmiarowe. Wystarczy tak: Game() : gameOver( false ) { } Dla typów złożonych lepiej użyć listy inicjalizacyjnej, bo to jedno wywołanie konstruktora, a nie dwa plus kopiowanie. |
|
« 1 » 2 |