4

私には2つのクラスがあり、どちらも他のクラスの一部を使用しています。例:

// class1.h
class Class1;
#include "class2.h"

class Class1 {
  public:
  static Class2 *C2;
  ...
};

// class2.h
class Class2;
#include "class1.h"

class Class2 {
  public:
  static Class1 *C1;
  ...
};

#ifndefそして、上記の例のように定義すると、機能します (ヘッダーの無限再帰を避けるためにいくつかあります)。しかし、クラスにいくつかのインライン関数を追加したいとも思っています。そして、インライン関数の定義をヘッダーファイルに配置する必要があることをここで読みました.cppファイルに配置して他のcppファイルから呼び出したい場合は機能しないためです(実行すると、未定義の参照が発生しますリンクしています)。しかし、ここでの問題は次のようなものです。

// class1.h
...
inline void Class1::Foo() {
  C2->Bar();
}

エラーが表示されます: 不完全な型 'struct Class2' の無効な使用。

どうすればそれができますか?

4

3 に答える 3

8

ヘッダーを含めるのを遅らせる必要がありますが、それを含めてインライン メソッドを定義します。各ヘッダーでこれを行うことにより、それらは自己完結型であり、一方を含めると常に他方が含まれ、インクルード ガードが無限再帰を防ぎます。

A.hpp

#ifndef INCLUDE_GUARD_B9392DB18D114C1B8DFFF9B6052DBDBD
#define INCLUDE_GUARD_B9392DB18D114C1B8DFFF9B6052DBDBD

struct B;

struct A {
  B* p;
  void foo();
};

#include "B.hpp"

inline
void A::foo() {
  if (p) p->bar();
}

#endif

B.hpp

#ifndef INCLUDE_GUARD_C81A5FEA876A4C6B953D1EB7A88A27C8
#define INCLUDE_GUARD_C81A5FEA876A4C6B953D1EB7A88A27C8

struct A;

struct B {
  A* p;
  void bar();
};

#include "A.hpp"

inline
void B::bar() {
  if (p) p->foo();
}

#endif
于 2010-02-09T23:02:07.153 に答える
2

あなたはそれを混ぜ合わせました。あなたが望むものは:

// class1.h
class Class2;

class Class1 {
  public:
  static Class2 *C2;
  ...
};

// class2.h
class Class1;

class Class2 {
  public:
  static Class1 *C1;
  ...
};

そして、ソースにそれぞれのヘッダーを含めます。この線:

class Class1; // or Class2

不完全な型を宣言し、不完全な型へのポインタと参照を持つことができます。ただし、使用時には、完全である必要があります。だから、「ねえ、それは存在するだろう!」と言ってください。ヘッダーとソースで、それが何であるかを伝えます。

于 2010-02-09T23:00:12.943 に答える
0

私の提案は、共通のメソッドとメンバーを基本クラスに配置し、基本クラスからC1とC2を派生させることです。これにより、循環依存の問題が修正される場合があります。

于 2010-02-10T18:09:28.617 に答える