0

C++ のフレンド関数で問題が発生していますが、それはプリプロセッサ ディレクティブと #include で発生した問題の兆候であると考えています。

これは私がやっていた愚かな例です。5 つのファイル: bobby.h、bobby.cpp、billy.h、billy.cpp、および main.cpp。Billy には、ReceiveMoney という保護された機能があります。Bobby には、Billy の ReceiveMoney を呼び出す bank という関数があります。つまり、ボビーが銀行に行くたびに、彼はビリーとお金を分割します。

ビリー.h

#ifndef BILLY_H
#define BILLY_H
#include "bobby.h"

class Billy
{
friend void Bobby::Bank(int, Billy &);
public:
    Billy();
protected:
    void ReceiveMoney(int inc);
private:
    int money;
};
#endif

ビリー.cpp

#include "billy.h"

Billy::Billy()
{
    money = 0;
}

void Billy::ReceiveMoney(int inc)
{
    money+=inc;
}

ボビー.h

#ifndef BOBBY_H
#define BOBBY_H

#include "billy.h"

class Bobby
{
public:
    Bobby();
    void Bank(int amount, Billy & b);
protected:
    int money;
};
#endif

ボビー.cpp

#include "bobby.h"

Bobby::Bobby()
{
    money = 0;
}
void Bobby::Bank(int amount, Billy & b)
{
    b.ReceiveMoney(amount/2);
}

main.cpp

#include "billy.h"
#include "bobby.h"

int main()
{
    Bobby bo;
    Billy bi;
    bo.Bank(150, bi);
    return 0;
}

多数のエラーが発生します。通常、エラー C2653: 'Bobby' : is not a class or namespace name または error C2653: 'Billy' : is not a class or namespace name

私はVS0の空のコンソールプロジェクトでこれをやっています

4

3 に答える 3

3

ヘッダー ファイルの循環依存関係があります。
billy.hが含まれていますがbobby.hbobby.h含まれていますbilly.h
明らかに、コンパイラはこの循環依存のために型を認識できません。

最善の解決策は、設計を再考して循環依存を回避するか、Forward 宣言
を 使用して循環依存を解消することです。

クラスを宣言するだけBillyですbobby.h

//#include "billy.h"     <-----  You don't need this include 
class Billy;             <-----  Just Forward Declaration should suffice

ここで前方宣言を使用できます。これは、不完全な型を受け入れる/返す関数またはメソッドを宣言するためです。この場合Billyは、コンパイラの不完全な型です。

于 2012-05-15T10:14:50.883 に答える
1

#include にループがあり、それを行うことはできません。billy.h で Bobby の前方宣言を使用する必要があります。などclass Bobby;。それでもフレンド関数を宣言することはできません。

唯一の本当の解決策は、friend. ReceiveMoney実際、公開する必要があります。Bobby がアカウントのようなものを表している場合、それは論理的です。

の制約friendにより、クラスの内部動作を解決する場合にのみ役立ちます (たとえば、それらを実装するコレクションとノードを使用する場合)。

于 2012-05-15T10:23:53.857 に答える
0

循環依存のため、完全に定義されたクラスはありません。したがって、多数のエラーが発生します。可能であれば、デザインを変更して、必要なものだけを継承または含めるようにしてください。Als の前方宣言で述べたように、選択することができます。循環依存は、主に設計上の問題が原因で発生します。

于 2012-05-15T10:24:23.557 に答える