"Zasady" działania szachów/szachownica

0

Hej, potrzebuje pomocy z zadaniem załączonym w zdjęciu
screenshot-20210220193618.png
Jestem w momencie tablicy dwuwymiarowej oraz tej funkcji Wyświetl(). Nie za bardzo rozumiem w jaki sposób ta tablica ma wyglądać oraz gdzie powinna zostać umieszona funkcja wyświetl.
To jest mój aktualny kod:

#include <iostream>

using namespace std;

class Figura
{
    string nazwa;
public:
    virtual void PoruszamSie() = 0;
};
class Pion:public Figura
{
    string nazwa;
public:
    Pion(string _nazwa="Pionem")
    {
        nazwa=_nazwa;
    }
    void PoruszamSie()
    {
        cout << "Jestem " << nazwa << " poruszam sie o jedno pole." << endl;
    };
};
class Wieza:public Figura
{
    string nazwa;
public:
    Wieza(string _nazwa="Wieza")
    {
        nazwa=_nazwa;
    }
    void PoruszamSie()
    {
         cout << "Jestem " << nazwa << " poruszam sie o dowoln¹ liczbê wolnych pól w poziomie i pionie." << endl;
    };
};
class Goniec:public Figura
{
    string nazwa;
public:
    Goniec(string _nazwa="Goncem")
    {
        nazwa=_nazwa;
    }
    void PoruszamSie()
    {
        cout << "Jestem " << nazwa << " poruszam sie o dowoln¹ liczbê wolnych pól po przek¹tnych." << endl;
    };
};
class Skoczek:public Figura
{
    string nazwa;
public:
    Skoczek(string _nazwa="Skoczkiem")
    {
        nazwa=_nazwa;
    }
    void PoruszamSie()
    {
        cout << "Jestem " << nazwa << " poruszam sie na wzor litery L w kazda strone." << endl;
    };
};
class Hetman:public Figura
{
     string nazwa;
public:
    Hetman(string _nazwa="Hetmanem")
    {
        nazwa=_nazwa;
    }
    void PoruszamSie()
    {
        cout << "Jestem " << nazwa << " poruszam sie o dowoln¹ liczbê wolnych pól w poziomie, pionie i na ukos." << endl;
    };
};
class Krol:public Figura
{
     string nazwa;
public:
    Krol(string _nazwa="Krolem")
    {
        nazwa=_nazwa;
    }
    void PoruszamSie()
    {
        cout << "Jestem " << nazwa << " poruszam sie o jedno pole w poziomie, pionie lub na ukos." << endl;
    };
};

int main()
{
    Pion p;
    Wieza w;
    Goniec g;
    Skoczek s;
    Hetman h;
    Krol k;

    Figura *wsk;
    wsk = &k;
    wsk -> PoruszamSie();
    return 0;
}

1

Póki co jest ok, pomijajac kodowanie znaków. Funkcja Wyswietl() ma być tam gdzie main, czyli w globalnym scope. Co do tablicy to masz tablicę Figura* tablica[...] a w niej masz np. element new Krol()

1

te konstruktory z defaultowym argumentem stringowym to zupełnie nie tak.
raczej coś takiego.

class Figura
{
 private:
    string nazwa;
protected:
    Figura(string nz) : nazwa(nz)
   {}
public:
    virtual void PoruszamSie() = 0;
    string GetNazwa() const 
    { return nazwa; }
      
};

class Skoczek:public Figura
{
public:
    Skoczek() : Figura("Skoczkiem")
    {
    }
    void PoruszamSie()
    {
        cout << "Jestem " << GetNazwa() << " poruszam sie na wzor litery L w kazda strone." << endl;
    };
};

tablica w rodzaju, ze względu na dziedziczenie nie moze być na wartość w.w typu, tylko na wskaźnik albo referencję do typu bazowego

Figura * arr[2][8];
lub std::array bardziej w duchu C++
std::array<std::array<Figura*,8>,2> arr;

Wszystko pisane bez kompilacji.

A o wyświetl(), to nie rozumiem. jestem nieco daleko od szkolnej informatyki

0

@AnyKtokolwiek:
Nie za bardzo rozumiem tego w protected, to tak powinienem robic takie konstruktory?

0

Ach przeoczyłem to oczywiscie :) Zauważ że każda figura ma nazwę, więc zrób pole nazwa w klasie bazowej Figura a nie w każdej podklasie.

0

@Shalom: okej, postaram sie to ogarnac.Ta tablica takze ma byc mainie c'nie?

0

To napisałem cos takiego, w momencie gdy ta funkcja Wyswietl byla w mainie to wywalalo mi blad, wiec przenioslem ją nad maina i wszystko dziala. Nie wiem teraz jak zrobic ostatnie zdanie z zadania :
W programie powinniście użyć metodę Wyswietl() dla każdego elementu tablicy, w której znajdują się figury szachowe. Miałby ktoś z was jakis pomysl?

#include <iostream>

using namespace std;

class Figura
{
    string nazwa;
protected:
    Figura(string nz) : nazwa(nz)
   {}
public:
    virtual void PoruszamSie() = 0;
    string GetNazwa() const
    { return nazwa; }

};
class Pion:public Figura
{
public:
    Pion() : Figura("Pionem"){}
    void PoruszamSie()
    {
        cout << "Jestem " << GetNazwa() << " poruszam sie o jedno pole." << endl;
    };
};
class Wieza:public Figura
{
public:
    Wieza() : Figura("Wieza"){}
    void PoruszamSie()
    {
         cout << "Jestem " << GetNazwa() << " poruszam sie o dowolna liczbe wolnych pol w poziomie i pionie." << endl;
    };
};
class Goniec:public Figura
{
public:
    Goniec() : Figura("Goncem"){}
    void PoruszamSie()
    {
        cout << "Jestem " << GetNazwa() << " poruszam sie o dowolna liczbe wolnych pol po przekatnych." << endl;
    };
};
class Skoczek:public Figura
{
public:
   Skoczek() : Figura("Skoczkiem"){}
    void PoruszamSie()
    {
        cout << "Jestem " << GetNazwa() << " poruszam sie na wzor litery L w kazda strone." << endl;
    };
};
class Hetman:public Figura
{
public:
    Hetman() : Figura("Hetmanem"){}
    void PoruszamSie()
    {
        cout << "Jestem " << GetNazwa() << " poruszam sie o dowolna liczbe wolnych pol w poziomie, pionie i na ukos." << endl;
    };
};
class Krol:public Figura
{
public:
    Krol() : Figura("Krolem"){}
    void PoruszamSie()
    {
        cout << "Jestem " << GetNazwa() << " poruszam sie o jedno pole w poziomie, pionie lub na ukos." << endl;
    };
};
 void Wyswietl(Figura *wsk)
    {
      wsk -> PoruszamSie();
    };
int main()
{
    Figura* arr[2][8]=
    {new Wieza(),new Skoczek(),new Goniec(), new Hetman(), new Krol(),new Goniec(),new Skoczek(),new Wieza(),
     new Pion(),new Pion(),new Pion(),new Pion(),new Pion(),new Pion(),new Pion(),new Pion()};


    Pion p;
    Wieza w;
    Goniec g;
    Skoczek s;
    Hetman h;
    Krol k;

    Figura *wsk;
    wsk = &w;
    Wyswietl(wsk);
    return 0;
}

2
Konrad Zarzecki napisał(a):

@AnyKtokolwiek:

Nie za bardzo rozumiem tego w protected, to tak powinienem robic takie konstruktory?

Ja nie (do końca) rozumiem tego "nie rozumiem".

Słowo protected oznacza, że coś jest dostępne z kodu własnego i klas dziedziczących, a nie innego.
protected konstruktor mówi czytelnie programiście: nie próbuj powoływać tego obiektu "z ręki". W tym projekcie to jest dodatkowe, bo i tak klasa jest abstrakcyjna, ale są projekty inne.

a co do ogólnej konstrukcji, przeniosłem fakt posiadania nazwy tam, gdzie ma być zgodnie z zadaniem i rozsądkiem: w klasie bazowej. To jest porządna trwała wskazówka.

Czy zawsze tak pisać konstruktory?
Dość często w podobnych przypadkach, ale wszystko "zależy" .

Mam krytyczny kaprys co do zadania. Dość fajne wprowadzenie do obketówki, szczególnie dziedziczenia.
A widzę braki: bym chętnie widział tablicę nie gołą, ale w klasie np "Kolor" czy noszącej jakąś inną nazwę.

0

@AnyKtokolwiek:
W sensie a propos tego protected to chodzilo mi o Figura(string nz) : nazwa(nz) {} ten zapis. Sorki, ze troche bez sensu napisalem. Mialbys moze pomysl co moglbym zrobic jeszcze zeby ogarnac to: "W programie powinniście użyć metodę Wyswietl() dla każdego elementu tablicy, w której znajdują się figury szachowe." ? Jeszcze mialem do wyboru drugie zadanie, ktorego zdj moge podeslac ale wydawalo mi sie dosyc niezrozumiale napisane screenshot-20210221123332.png

2

@Konrad Zarzecki:

inicjowanie przed klamerkami? O to pytasz?

To jest bardziej rygorystyczna forma inicjowania pól - np w klamerkach nie zainicjujesz pola const, a w liście inicjacyjnej tak.
Moim zdaniem warto używac zawsze, jak się da - tzn nie da się, jak trzeba jakiś algorytm.

UPD:
w sumie zmień pole na, konstruktor na "bardziej zwyczajny"
const string nazwa;
i zobaczysz

1

Tym się pobaw, 2x2 zmiany, czyli 4 próby:

class Figura
{
    string nazwa < lub > const string nawa;
protected:
    Figura(string nz) : nazwa(nz)    {}
   < lub > 
    Figura(string nz) {  nazwa = nz }

public:
...
};

Podoba mi się, ze drążysz, a nie domagasz się gotowca.

0
AnyKtokolwiek napisał(a):
    string nazwa < lub > const string nawa;
/*///
string nazwa
/*/
const string nawa;
//*///

//*///
string nazwa
/*/
const string nawa;
//*///
0

@AnyKtokolwiek: Zauważyłem, że przy const string nazwa; Figura(string nz) { nazwa = nz; } wywala mi błąd
screenshot-20210221183056.png
A reszta 3 opcji działa normalnie i się kompiluje.

1
Konrad Zarzecki napisał(a):

@AnyKtokolwiek: Zauważyłem, że przy const string nazwa; Figura(string nz) { nazwa = nz; } wywala mi błąd
...

A reszta 3 opcji działa normalnie i się kompiluje.

i prawidłowo. W tym przypadku ma się drzeć. const'a zainicjujesz tylko z listy inicjacyjnej, a nie z klamerek
Rozjaśniło się nieco co do wersji konstruktorów?

1 użytkowników online, w tym zalogowanych: 0, gości: 1