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, botów: 0