6
#include <iostream>

class B;

class A{
 int a;
public:
 friend void B::frndA();
};

class B{
 int b;
public:
 void frndA();
};

void B::frndA(){
 A obj;
 std::cout << "A.a = " << obj.a << std::endl;
}

int main() {
 return 0;
}

このコードをコンパイルしようとすると、いくつかのエラーが発生しました。例えば

不完全なタイプの無効な使用

このコードの問題は何ですか?

4

3 に答える 3

3

class B ...宣言全体をの前に置きclass Aます。まだ宣言しB::frndA();ていません。

#include <iostream>
using namespace std;

class B{
    int b;
public:
    void frndA();
};

class A{
    int a;
public:
    friend void B::frndA();
};



void B::frndA(){
    A obj;
    //cout<<"A.a = "<<obj.a<<endl;
}

int main() {
    return 0;
}
于 2010-07-06T05:35:10.487 に答える
3

問題は、コンパイラが宣言を確認する前に、メンバー関数をフレンドできないことです。

問題を解決するには、コードを再配置する必要があります(つまり、の定義をclass B前に移動しますclass A)。

于 2010-07-06T05:37:08.343 に答える
2

Bの宣言を前に置く必要がありますA。コンパイラはこれについて知りません:B::frndA()。前方宣言は、型が持つメンバーを推測するのに十分な情報ではありません。

クラスA宣言をファイルに入れ、A.hその定義をファイルに入れることをお勧めしますA.cpp。とのB内部のタイプについても同様ですB.hB.cpp

各ヘッダーファイルの上部に配置します#pragma once(または、必要に応じてガードを含めます)。

次に、あなたの中にB.hあなたは単に含めることができますA.h

于 2010-07-06T05:35:37.650 に答える