1

AとBの2つのヘッダーがあります。これらは次のようになります。

// A.h
#include "B.h";

class A {
    // stuff
    AFunction(B* b);
    OtherFunction();
}

// B.h
class A;

BFunction(A* a);

循環依存を解決するのはこれが初めてなので、何をしているのかよくわかりません。私の問題は次のとおりです。BFunctionは、ある時点で、を呼び出しますa->OtherFunction();。OtherFunctionが前方宣言されていないためにエラーが発生し、明らかに前方宣言もできません。状況は対称的であるため(AFunctionはb-> SomeOtherFunction()を呼び出します)、include宣言とforward宣言を交換して修正することはできません。

どうすればこれを解決できますか?

4

4 に答える 4

1

タイプのポインターを割り当てるだけではない A または B について何かが必要な場合は、それらを循環的に含めることができないため、関連するコードを .cpp ファイルに移動する必要があります解決策は次のようなものです。

ああ

class B; // forward declaration

class A {
  B* b;

  // legal, you don't need to know anything about B
  void set(B* b) { this->b = b; } 

  // must be implemented in .cpp because it needs to know B
  void doSomethingWithB(); 
};

A.cpp

#include "A.h"
#include "A.h"

void A::doSomethingWithB() {
  b->whatever();

Bh

class A

class B {
  void methodWithA(A* a);
};

B.cpp

#include "B.h"
#include "A.h"

void B::methodWithA(A* a) {
  a->whatever();
}
于 2013-01-05T05:01:42.183 に答える
0

メンバー関数A::OtherFunction() からスタンドアローン関数に変更OtherFunction(A*)

于 2013-01-05T06:10:28.193 に答える
0

両方の .cpp ファイルには、両方の .h ファイルが含まれている必要があります。

簡単な例:

// A.h
void funcA();

// A.c
#include "A.h"
#include "B.h"
void funcA() { funcB(); }

// B.h
void funcB();

// B.c
#include "A.h"
#include "B.h"
void funcB() { funcA(); }

テンプレート化されたクラスを扱っている場合を除き、宣言ヘッダー ファイルに入り、定義(実装) はソース ファイルに入ります。

于 2013-01-05T04:57:55.773 に答える
0

クラス定義でポインターのみを使用している限り、.h ファイル内の各クラスの前に他のクラスを前方宣言し、両方の .hファイルを .cpp ファイルに含めることができます。

コードを .h ファイルのクラスの定義から.cppの関数の定義に移動して、依存関係を減らします。つまり、.cpp ファイル内の他のクラスの詳細を使用してすべての関数を定義します。

于 2013-01-05T04:58:59.047 に答える