2

クラス A とクラス B の 2 つのクラスがあります。私の目標は、両方のクラスで eachother 関数を使用することです。問題は、複数ファイルのインクルード構造では、それができないように見えることです。これが私がやろうとしていることです:

#file A.h

Class A{
public:
    int GetInfo();

private:
    B * ptrToB;
};

#file B.h

Class B{
public:
   int getStuff();
private:
   A * ptrToA;
};

私の目標は、Aクラスのメソッドが呼び出せるようにptrToB->getStuff()なり、Bクラスのメソッドが呼び出せるようになることですptrToA->getInfo()

これは可能ですか?どうして?そうでない場合、なぜですか?

4

3 に答える 3

4

多分前方宣言を使用していますか?

#file A.h

#ifndef ACLASS_H
#define ACLASS_H

Class B;

Class A{
public:
    int GetInfo();

private:
    B * ptrToB;
};

#endif

次に、CPP ファイルで。

#file A.cpp

#include "B.h"

A::A() : ptrToB(0)
{
  // Somehow get B
}

int A::GetInfo() 
{
  // Return whatever you need in here.
}

B クラスの H ファイルと CPP ファイルについても同じことが行われます。

前方定義により、コンパイラは明示的に定義されていなくても型を認識することができます。A クラスに B への参照がある場合は、B のヘッダーを含める必要があります。

B にアクセスするためにポインタを使用しているため、(CPP ファイル内で) アクセスするまで、コンパイラは内部データを知る必要はありません。

// Would need the header because we must know 
// the size of B at compile time.
class B;
class A 
{
  B theB; 
}


// Only need forward declaration because a 
// pointers size is always known by the compiler
class B;
class A
{
  B * bPointer; 
}
于 2013-05-15T19:44:43.100 に答える
2

前方宣言を使用して依存関係を壊すことができます:

#file A.h

Class A{
public:
    int GetInfo();

private:
    B * ptrToB;
};

#file B.h
struct A;
Class B{
public:
   int getStuff();
private:
   A * ptrToA;
};

その後、A.h問題なく B.cpp に、Bh を A.cpp に含めることができます。

于 2013-05-15T19:44:44.880 に答える
2

B*ファイル Ah に前方宣言を追加するだけで、aが後で定義するクラスへのポインターであることがコンパイラーに認識されます。

class B;

次に your を定義し、その後class Aに Bh を含めます。このようにして、Ah を含む誰もが と の両方class Aclass B定義します。

Bh には、先頭に Ah を含めるだけです。このようにして、Bh を含むすべての人が と の両方class Aclass B定義します。

関連する .cpp ファイルで関数を定義すると、両方のクラスが利用可能になり、必要に応じて関数を記述することができます。

この問題は相互再帰と呼ばれます。

于 2013-05-15T19:42:13.673 に答える