4neta Temat założony przez niniejszego użytkownika |
Tworzenie dziedziczonej klasy figury szachowej » 2019-08-07 11:19:43 Cześć. Zamierzam zaimplementować grę w szachy. To moje pierwsze spotkanie z klasami, dlatego zaczynam od pojedynczej bierki - pionka. Chcę zacząć od przypisania początkowej pozycji na szachownicy i wyświetlenia jej w głównej funkcji. Nie jestem pewna w którym miejscu nadać wartość zmiennej "positionX" i jak wyłuskać jej wartość dla "WhitePawn". Oto kod: #include <iostream>
using namespace std;
class Chessman { protected: int positionX; int positionY; };
class WhitePawn : public Chessman { public: WhitePawn(); };
WhitePawn::WhitePawn() : Chessman() { positionX = 0; }
int main() { return 0; } Mam świadomość, że nawet w tak prostym kodzie może być wiele błędów, dlatego już przy starcie nauki obiektówki proszę Was o pomoc. |
|
pekfos |
» 2019-08-07 17:58:05 class Chessman { protected: int positionX; int positionY; };
class WhitePawn : public Chessman { };
int main() { WhitePawn wp; cout << wp.getPositionX(); return 0; } I dla ułatwienia życia, zamiast się rozdrabniać na x i y, lepiej mieć strukturę tego typu struct Position { int x, y; }; |
|
4neta Temat założony przez niniejszego użytkownika |
» 2019-08-08 14:25:44 Dziękuję! Czy mogę zadać jeszcze kilka pytań? Będą dotyczyć składni i zależności między klasami, na przykładzie tego programu. Zadeklarowałam strukturę i funkcję w głównej klasie wszystkich bierek: class Chessman { public: struct position { int x, y; }; int getPosition(); }; Nie wiem w którym miejscu i w jaki sposób powiązać funkcję "getPosition". Powinna zwrócić jednocześnie dwa inty, aby w przyszłości móc wstawić figurę do macierzy szachownicy. Może wektor dwuelementowy zamiast struktury? Funkcja działa tak samo dla wszystkich figur, dlatego wypada ją umieścić w klasie "Chessman". Jednak ja robię to źle: Chessman::getPosition() { return position; } Dalej, w klasie pionka: class Pawn : public Chessman { position.x = 0; position.y = 1; }; Struktura "position" jest niewidoczna dla klasy pionka. Jak to naprawić? Jest jeszcze funkcja "main": int main() { Pawn wp1; cout << wp1.getPosition(); return 0; } (Przepraszam za moje niedouczenie - w tym temacie pojawia się nagle wiele rzeczy i trudno mi to opanować za jednym zamachem. Chciałabym poznać w praktyce jak to działa i dlatego staram się stworzyć działający program.) |
|
pekfos |
» 2019-08-08 18:12:17 Struktura jest definicją typu, a nie zmiennej. Struktury |
|
4neta Temat założony przez niniejszego użytkownika |
» 2019-08-11 19:30:37 Dziękuję. Z klasami już się uporałam, ale mam kłopot ze strukturą (pokażę jedynie istotne fragmenty): class Chessman { private: struct pos { int x, y; }; pos position; public: Chessman( int, int ); pos getPosition(); }; Chciałabym stworzyć metodę, która w pewien użyteczny sposób zwróci obie współrzędne: pos Chessman::getPosition() { return position; } Nie działa. Niestety nigdzie nie znajduję przykładu takiego użycia struktury. Konstruktor: Chessman::Chessman( int n, int m ) { position.x = n; position.y = m; } Tutaj "Constructor does not initialize field: position". To samo było, gdy argumentem była pojedyncza zmienna typu pos. Co robić? |
|
pekfos |
» 2019-08-11 19:56:51 Chciałabym stworzyć metodę, która w pewien użyteczny sposób zwróci obie współrzędne:
pos Chessman::getPosition() { return position; } Nie działa. |
Nie ma usprawiedliwienia na pisanie "nie działa", kiedy dostajesz błąd kompilacji, który ma treść. Powinno być Chessman::pos Chessman::getPosition()
bo pos należy do Chessman, zresztą zupełnie niepotrzebnie. |
|
4neta Temat założony przez niniejszego użytkownika |
» 2019-08-11 20:10:49 Przepraszam, już uzupełniam komunikaty. Wyrzuciłam strukturę: struct pos { int x, y; };
class Chessman { private: pos position; public: explicit Chessman( pos ); pos getPosition(); };
Chessman::Chessman( pos initialPosition ) { position = initialPosition; } Chessman::Chessman(pos initialPosition){ - Constructor does not initialize these fields: position Identyczny komunikat dla: Chessman::Chessman( int n, int m ) { position.x = n; position.y = m; } Nawet gdy połączę inicjowanie trzech zmiennych w konstruktorze, to wciąż nie inicjuję zmiennej "position". |
|
pekfos |
» 2019-08-11 20:18:19 To błąd? Możesz spróbować zainicjalizować przez konstruktor w strukturze, żeby pozbyć się tego komunikatu struct pos { int x, y; pos( int x = 0, int y = 0 ) : x( x ) , y( y ) { } };
Chessman::Chessman( int x, int y ) : position( x, y ) { } |
|
« 1 » 2 3 |