[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