Przyjaźń - klasy A z metodą klasy B; błąd: składnik niedostępny

0

Witam,

przerabiam temat przyjaźni zgodnie z kursem C++ K.Kuczmarskiego (xion) będącego częścią megatutoriala "Od zera do gier kodera".

Zatrzymałem się na temacie przyjaźni: metoda PrzecinajaSie() klasy CGeometryManager ma dostęp do wszystkich składników klasy CCircle. W przykładzie z kursu wygląda to tak:

 
// deklaracja zapowiadająca klasy CCircle
class CCircle;
class CGeometryManager
{
public:
bool PrzecinajaSie(CCircle&, CCircle&);
};
class CCircle
{
// (pomijamy resztę)
friend bool CGeometryManager::PrzecinajaSie(CCircle&, CCircle&);
};

Zmodyfikowałem powyższy przykład do takiej postaci, aby wypróbować jak to działa :

#include <iostream>
using namespace std;

class CCircle;

class CGeometryManager
{
public:
	bool PrzecinajaSie(CCircle&c1, CCircle&c3)
	{
		cout<<c1.i<<endl; // Error: member CCircle::i (declared at...) is inaccessible
		
		return 0;
	}

};

class CCircle
{
int i;
friend bool CGeometryManager::PrzecinajaSie(CCircle&, CCircle&);
}; 

I już na tym etapie VS pokazuje mi błąd, że zmienna i jest niedostępna.

Error: member CCircle::i (declared at...) is inaccessible

Może ktoś z Was potrafi mi pomóc, bo szczerze powiedziawszy od dwóch dni mnie to blokuje.

0

Po twojej modyfikacji kompilator musi użyć składową CCircle::i o tu:
cout<<c1.i<<endl;
przed tym jak dowie się o istnieniu tej składowej:
int i;

To proste nie możesz zrobić tej metody jako inline bez dodatkowych skomplikowanych kombinacji, więc zostaw w klasie tylko i wyłącznie deklaracje.

0

Niestety :( wcześniej też próbowałem, gdy funkcja nie jest inline i także wyświetla ten sam błąd :

 
#include <iostream>
using namespace std;

class CCircle;

class CGeometryManager
{
public:
	bool PrzecinajaSie(CCircle&c1, CCircle&c3);

};

class CCircle
{
int i;
friend bool CGeometryManager::PrzecinajaSie(CCircle&, CCircle&);
};

bool CGeometryManager::PrzecinajaSie(CCircle&c1, CCircle&c3)
{
	cout<<c1.i<<endl; //Error: member CCircle::i (declared at...) is inaccessible
}

0

Faktycznie na VS2010 działa prawidłowo.

Natomiast na VS2012 wygląda to następująco :
mir7twdo9h5s_t.jpg
Nie mniej jednak kompilacja zakończona powodzeniem.

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