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

Tworzenie dziedziczonej klasy figury szachowej

Ostatnio zmodyfikowano 2019-08-21 18:41
Autor Wiadomość
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:
C/C++
#include <iostream>

using namespace std;

class Chessman
{
protected:
    int positionX;
    int positionY;
};

class WhitePawn
    : public Chessman
{
    //protected:
    //    Chessman::positionX = 0;
   
public:
    WhitePawn();
};

WhitePawn::WhitePawn()
    : Chessman() // constructor
{
    positionX = 0;
}

int main() {
    //    cout << WhitePawn.positionX; // niepoprawne
    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.
P-174982
pekfos
» 2019-08-07 17:58:05
C/C++
class Chessman
{
    // Tu konstruktor inicjalizujacy positionX i positionY
    // oraz metody zapewniające dostęp do tych pól
protected:
    int positionX;
    int positionY;
};

class WhitePawn
    : public Chessman
{
    // nic
};

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
C/C++
struct Position
{
    int x, y;
};
P-174985
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:
C/C++
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:
C/C++
Chessman::getPosition() {
    return position;
}
Dalej, w klasie pionka:
C/C++
class Pawn
    : public Chessman
{
    position.x = 0;
    position.y = 1;
};
Struktura "position" jest niewidoczna dla klasy pionka. Jak to naprawić?

Jest jeszcze funkcja "main":
C/C++
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.)
P-174986
pekfos
» 2019-08-08 18:12:17
Struktura jest definicją typu, a nie zmiennej.
» Kurs C++ » Poziom 5Struktury lekcja
P-174990
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):
C/C++
class Chessman
{
private:
    struct pos {
        int x, y;
    };
    pos position; // tworzę zmienną dla współrzędnych typu pos
public:
    Chessman( int, int );
    pos getPosition();
};

Chciałabym stworzyć metodę, która w pewien użyteczny sposób zwróci obie współrzędne:
C/C++
pos Chessman::getPosition() {
    return position;
}
Nie działa. Niestety nigdzie nie znajduję przykładu takiego użycia struktury.
Konstruktor:
C/C++
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ć?
P-175002
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:
C/C++
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ć
C/C++
Chessman::pos Chessman::getPosition()
bo pos należy do Chessman, zresztą zupełnie niepotrzebnie.
P-175004
4neta
Temat założony przez niniejszego użytkownika
» 2019-08-11 20:10:49
Przepraszam, już uzupełniam komunikaty. Wyrzuciłam strukturę:
C/C++
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:
C/C++
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".
P-175005
pekfos
» 2019-08-11 20:18:19
To błąd? Możesz spróbować zainicjalizować przez konstruktor w strukturze, żeby pozbyć się tego komunikatu
C/C++
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 )
{
}
P-175006
« 1 » 2 3
  Strona 1 z 3 Następna strona