2011-02-11 1 views
27

私は2つのクラスを作成しようとしていますが、それぞれには他のクラスタイプのオブジェクトが含まれています。これどうやってするの?私がこれを行うことができない場合、各クラスにポインタ他のクラスの型を含むような回避策がありますか?ありがとう!ここでC++で互いにデータを使用する2つのクラスを作成するには?

は、私が持っているものです。

ファイル:bar.h

#ifndef BAR_H 
#define BAR_H 
#include "foo.h" 
class bar { 
public: 
    foo getFoo(); 
protected: 
    foo f; 
}; 
#endif 

ファイル:がfoo.h

#ifndef FOO_H 
#define FOO_H 
#include "bar.h" 
class foo { 
public: 
    bar getBar(); 
protected: 
    bar b; 
}; 
#endif 

ファイル:main.cppに

fooはそのバーを併設していますので、そうでなければ、(オブジェクトのための無限の空間を必要とすると思いますので、あなたは、直接他のタイプのオブジェクトが含まれている2つのクラスを持つことはできません
#include "foo.h" 
#include "bar.h" 

int 
main (int argc, char **argv) 
{ 
    foo myFoo; 
    bar myBar; 
} 

$ G ++ main.cppに

In file included from foo.h:3, 
       from main.cpp:1: 
bar.h:6: error: ‘foo’ does not name a type 
bar.h:8: error: ‘foo’ does not name a type 

答えて

72

実際には、2つのクラスに相互にポインタを格納させることで、これを行うことができます。 2つのクラスが互いの存在を知っているように、これを行うには、前方宣言を使用する必要があります:2つのヘッダはそれぞれが含まれていないことを

#ifndef BAR_H 
#define BAR_H 

class foo; // Say foo exists without defining it. 

class bar { 
public: 
    foo* getFoo(); 
protected: 
    foo* f; 
}; 
#endif 

#ifndef FOO_H 
#define FOO_H 

class bar; // Say bar exists without defining it. 

class foo { 
public: 
    bar* getBar(); 
protected: 
    bar* f; 
}; 
#endif 

お知らせその他。代わりに、彼らは前方宣言を介して他のクラスの存在を知っているだけです。次に、これらの2つのクラスの.cppファイルには、#includeの他のヘッダーを使用して、クラスに関する完全な情報を取得できます。これらの前方宣言により、 "foo need bar needs foo need bar"という参照サイクルを壊すことができます。

+8

"fooがバーがfooのニーズバーを必要とする必要があります。"芝生。 = P – prolink007

3

これは意味をなさない。 AがBを含み、BがAを含む場合、無限大になります。 2つのボックスを置いて、お互いを入れようとしていると想像してください。うまくいきませんよね?

ポインタとはいえ仕事:

#ifndef FOO_H 
#define FOO_H 

// Forward declaration so the compiler knows what bar is 
class bar; 

class foo { 
public: 
    bar *getBar(); 
protected: 
    bar *b; 
}; 
#endif 
+9

私はFuturamaで動作することを見た! –

関連する問題