[c++]Używanie metod innej klasy

0

Mam klasę mapa posiadająca pola - plansza (trójwymiarowy wektor), xplanszy, yplanszy (wymiary planszy), oraz klasę pionek z polami x,y przechowującymi współrzędne pionka.

W klasie mapa mam takie metody jak upuść (bierze pionek i na polu o jego współrzędnych do vectora wstawia char go reprezentujący), oraz podnieś(z pola o współrzędnych pionka podnosi znak który jest na kocu wektora).

w pionku za to mam metodę odpowiedzialna za ruch pionka, działa ona na zasadzie używa funkcji podnieś, zmienia współrzędne pionka a następnie używa upuść.

I tu pojawia mój problem - jak w mainie używam podnieś, upuść nie ma problemu, jak w klasie pionek nie działa. Czytałem o zaprzyjaźnianiu jednak nie wiem jak rozwiązać ten problem.

class mapa
{
friend class pionek;
public:
    vector< vector< vector<char> > > plansza;
    int xplanszy;
    int yplanszy;
//konstruktory destruktory inne metody
    void upusc(int x, int y, char znak)
    {
        if (plansza[y-1][x-1][0]=='.')
        {
            plansza[y-1][x-1][0]=znak;
        }
        else
        {
            plansza[y-1][x-1].push_back(znak);
        }
    }
    void podnies(int x, int y)
    {
        if(plansza[y-1][x-1].size()>1)
        {
        plansza[y-1][x-1].pop_back();
        }
        else
        {
            plansza[y-1][x-1][0]='.';
        }
    }
};

class pionek{
public:
    int x;
    int y;
//konstruktory inne metody
    void ruch(mapa plansza)
    {
        plansza.podnies(x,y);
        //tutaj kod odpowiedzialny za zmiane wspolrzednych
        plansza.upusc(x,y,'W'); //W to symbol naszego pionka
    }
};

//dalej mamy main, tworzymy mape, tworzymy pionek o wybranych współrzędnych, umieszczamy go na mapie z poziomu main
//Wieza - obiekt klasy pionek, mapaa - obiekt klasy map

Wieza.ruch(mapaa);

Jak spowodować aby te ponoszenia opuszczenia w klasie pionek wpłynęły na obiekt klasy mapa?

1

Zaprzyjaźnienie jest Ci tu nie potrzebne - wszystko i wszędzie masz publiczne.
Przekazuj do funkcji ruch obiekt mapa przez referencję, albo wskaźnik - w przeciwnym wypadku pracujesz na kopii obiektu, a nie jego oryginale.

0
  1. Musisz chyba się dowiedzieć czy się różni kopia obiektu od samego obiektu. Bo ta:
    void ruch(mapa plansza)

    metoda NIE zostanie wywołana na oryginalnej mapie, a jedynie na jej lokalnej kopii

  2. A czemu pionek nie jest związany z planszą w żaden sposób? Na moje oko powinna tu być kompozycja (tzn mapa zawiera w sobie pionki), albo przynajmniej pionek powinien posiadać wskazanie do mapy na której się znajduje i odwrotnie.
0

Dzięki już rozumiem błąd

Co do kompozycji - akurat z tym problemu nie ma po prostu mam tak skonstruowany program ze pionki sobie "żyją" w swojej tablicy, a mapa służy jedynie do wyświetlenia ich pozycji na mapie - jakoś akurat tak było mi wygodniej.

-------------EDIT----------------

Kurcze pisałem kod częściowo z głowy do tego tematy, odpisałem tez bez sprawdzania - spojrzałem teraz w kod i patrze ze w sumie plansza u mnie jest wskaznikiem:

mapa* mapaa;
    mapaa = new mapa(xplanszy,yplanszy);

//xplanszy yplanszy to jej wymiary, a odwołouje się do niej w ten sposób:

wieza->ruch(*mapaa);

Czyli niby odwołuje się już do wskaźnika, czyli co? Mam zrobić wskaźnik na wskaźnik? Mógłby ktoś fragment kodu napisać krótki jak to napisać?

1

ehh... w ten sposób do funkcji NIE przekazujesz wskaźnika, tylko obiekt, na który ten wskaźnik pokazuje - a że przekazujesz przez wartość to jest robiona jego kopia i ta kopia jest dostępna w funkcji.
zmień w tym wypadku prototyp funkcji na void ruch(mapa *plansza) i wywołanie na wieza->ruch(mapa)

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