друг — C ++: предоставление функции-члена дружба, предварительное объявление?

У меня проблема с дружбой в с ++. У меня есть два класса, 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 приведен еще один аналогичный пример, но пример не запускается на моем компьютере, поэтому мне нужно проверить некоторые флаги компилятора или что-то еще?

-1

Решение

Обменять это вокруг?

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;
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]