0

次のように、1 つの cpp ファイル内に 2 つのクラスがあります。

class A
{
private:
  int somethingPrivate;
  B *aReferenceToB;
public
  B returnSomeB()
  {
    aReferenceToB->someFunction();
    return *aReferenceToB;
  }
};

class B
{
private:
  A needed_Class_A_var;
public:
  void someFunction()
  {
    return;
  }
};

これら 2 つのクラスを相互に使用すると、次のようなあらゆる種類のエラーが生成されます。

エラー C2143: 構文エラー: ';' がありません 前 '*'

クラスごとに個別のファイルを作成せずに、cpp ファイルを 1 つだけ使用することなく、この ciclic インクルードの問題を解決するにはどうすればよいですか?

class B;定義の前に宣言を追加しようとしましたが、class A正しく機能しません。

4

1 に答える 1

3

Bクラス ( )のメンバーにアクセスする前、または (へのポインターではなく) ( )aReferenceToB->someFunction()のオブジェクトを返そうとする前に、firstの完全な定義が必要です。BBB returnSomeBclass B

したがって、returnSomeB本体を定義から抽出し、 の完全な定義が知られているclass A場所に配置します。B

class B;

class A
{
private:
  int somethingPrivate;
  B *aReferenceToB;
public:
  B returnSomeB();
};

class B
{
private:
  A needed_Class_A_var;
public:
  void someFunction()
  {
    return;
  }
};



B A::returnSomeB(){
    aReferenceToB->someFunction();
    return *aReferenceToB;
}

このようなものを書き込もうとする場合は、次のことに注意してください。

class B;

class A
{
private:
  int somethingPrivate;
  B *aReferenceToB;
public:
  B* returnSomeB() { return aReferenceToB; }
};

ここではポインターのみを操作しているため (この場合、 のオブジェクトを作成Bしておらず、 のメンバーにはアクセスしていませんB)、ポインターのサイズは でわかっているため、これは有効です。class B定義がなくてもコンパイル時間。

于 2013-09-12T15:00:26.877 に答える