-1

C ++での友情に問題があります。A と B の 2 つのクラスがあり、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()関数を導入したりする必要はありません)。私はまた、別のヘッダーで定義されたクラスからの関数への友情の付与を見てきましたが、私のクラスは1つの.cppファイルにあり(そのようにしておくことが望ましいでしょう)、別のヘッダーファイルにはありません。とにかくクラス全体の友情を認めたくありません。一方、C++ の Forward 宣言、フレンド関数の問題少し単純な問題に対する答えを提供します。定義の順序を変更することはできません。一方、http://msdn.microsoft.com/en-us/library/ahhw8bzz.aspxは別の同様の例を提供していますが、この例は私のコンピューターでは実行できません。コンパイラ フラグなどを確認する必要がありますか?

4

1 に答える 1

3

いろいろ入れ替え?

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;
}
于 2012-12-21T17:11:03.993 に答える