У меня проблема с дружбой в с ++. У меня есть два класса, A и B, где определение B использует некоторый экземпляр A. Я также хочу дать функции-члену в B доступ к частным элементам данных в A, и, таким образом, предоставить ему дружбу. Но теперь загадка заключается в том, что для объявления дружбы в определении класса A класс B еще не определен, поэтому IDE (VS 2010) не знает, что с ним делать.
#include <iostream>
using namespace std;
class B;
class A {
friend int B::fun(A A);//B as yet undefined here
int a;
};
class B {
int b;
public:
int fun(A inst);
};
int B::fun(A A)
{
int N = A.a + b;//this throws up an error, since a is not accessible
return N;
}
Я посмотрел на Почему эта функция друга не может получить доступ к закрытому члену класса? но предложение использовать предварительную декларацию class B;
не похоже на работу. Как я могу решить эту проблему напрямую (т.е. не прибегая к class B
друг class A
или делая B унаследованным от A или вводя getA()
функция)? Я также посмотрел на Предоставление дружбы функции из класса, определенного в другом заголовке, но мои классы находятся в одном файле .cpp (и было бы желательно сохранить его таким образом), а не в отдельных заголовочных файлах, и я все равно не хочу предоставлять дружбу всему классу. В то же время, Прямое объявление C ++, проблема с функцией друга дает ответ на несколько более простую проблему — я не могу просто изменить порядок определений. В то же время, http://msdn.microsoft.com/en-us/library/ahhw8bzz.aspx приведен еще один аналогичный пример, но пример не запускается на моем компьютере, поэтому мне нужно проверить некоторые флаги компилятора или что-то еще?
Обменять это вокруг?
class A;
class B
{
public:
int fun(A inst);
private:
int b;
};
class A
{
friend int B::fun(A A);
private:
int a;
};
int B::fun(A A)
{ int N = A.a + b;
return N;
}
Других решений пока нет …