Klasa zaprzyjaźniona z funkcją

0

Witam,
chciałem napisać programik w którym jest klasa zaprzyjaźniona z funkcją gotoxy (piszę w code::blocks). Programik chciałem zrobić w ramach ćwiczeń. Niby wszystko ok. Jest tylko jeden problem kompilator wyrzuca błąd, że składniki x i y są prywatne pomimo tego, że zaprzyjaźniłem funkcję gotoxy z klasą. A czytałem, że jak się zaprzyjaźnia funkcję z klasą to funkcja może korzystać ze składników prywatnych klasy tak jakby nie były prywatne. Jestem po nocce więc mogę czegoś nie kumać ale proszę o wytłumaczenie dlaczego kompilator może się buntować. Dodam tylko, że jak zrobię x i y publiczne to wszystko działa bez zarzutu. Z góry dziękuje za pomoc.

#include <iostream>
#include <windows.h>

using namespace std;

class Gracz
		{
			int x,y;
			public:
			Gracz(int a=12, int b=12):x(a),y(b){};
			friend void gotoxy (int x, int y);
		};

void gotoxy (int x, int y)
{
    COORD cord;
    cord.X = x;
    cord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cord);
}


int main (void)
{
		Gracz p;

		gotoxy (p.x,p.y);
		cout << "Cos"<<endl;

		gotoxy(5,5);
		cout << "Cos2"<<endl;
		system ("pause");
		return 0;
}
0

Taruun, a gdzie u Ciebie gotoxy korzysta ze składowych klasy? Nigdzie? Argumenty dla funkcji przekazuje przecież main, to main próbuje uzyskać dostęp do składowych!

0

Oto ciąg dalszy mojego programu ćwiczeniowego. W programie chodzi o to żeby sterować napisem "coś" po planszy. Wszystko działa jest tylko mały problem chciałem żeby ten napis poruszał się po planszy 23x77 i wydaje mi się, że dobrze ustawiłem zakres planszy w funkcji sterowanie. Ale znaczek niestety wychodzi poza ten zakres a napisałem podobny:-( nie wiem dlaczego. Proszę o pomoc w znalezieniu przyczyny.

w innym programie funkcje sterowanie miałem zrobioną tak i znaczek nie wychodził poza zakres:

void Gracz :: sterowanie (char s,int x, int y, int *w, int *w1)
{
    if ((s=='w') && (x>=1)) {x=x-1; *w=x; *w1=y;}
        else if ((s=='s') && (x<=23)) {x=x+1; *w=x; *w1=y;}
        else if ((s=='a') && (y>=1)) {y=y-1; *w=x; *w1=y;}
        else if ((s=='d') && (y<=77)) {y=y+1; *w=x; *w1=y;}
}

MÓJ PROGRAM

#include <iostream>
#include <conio.h>
#include <windows.h>

using namespace std;

class Gracz
		{
			int x,y;
			public:
			Gracz(int a=12, int b=12):x(a),y(b){};
			void wypisz();


			friend Gracz sterowanie (char s,Gracz p);
			friend void gotoxy (Gracz);
		};

Gracz sterowanie (char s,Gracz p)
{
	Gracz r;
	if ((s=='w') && (r.y>=1)) {r.y=p.y-1; r.x=p.x; return r;}
            else if ((s=='s') && (r.y<=23)) {r.y=p.y+1; r.x=p.x;return r;}
            else if ((s=='a') && (r.x>=1)) {r.x=p.x-1; r.y=p.y;return r;}
            else if ((s=='d') && (r.x<=77)) {r.x=p.x+1; r.y=p.y;return r;}
}

void Gracz :: wypisz()
{
	cout<<"P rowna sie: "<< "x="<<x<< " y=" <<y ;
}

void gotoxy (Gracz p)
{
    COORD cord;
    cord.X = p.x;
    cord.Y = p.y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cord);
}


int main (void)
{
		Gracz p;
		char s;


		do {
			gotoxy(p);
			cout << "@"<<endl;
			s=getch();
			p=sterowanie(s,p);
			system("cls");
			p.wypisz();
			}while(s!='n');
		system ("pause");
		return 0;
}

</cpp>
0
void sterowanie (char s,Gracz &p)
{
	switch(s)
	{
	case 'w': if(r.y > 0)		--p.y; break;
	case 's': if(r.y < 23 - 1)	++p.y; break;
	case 'a': if(r.y > 0)		--p.x; break;
	case 'd': if(r.y < 77 - 1)	++p.x; break;
	};
}

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