2012-03-12 8 views
1

したがって、FooというクラスとBarというクラスがあります。 BarFooのインスタンスを含み、FooにはBarをパラメータとして持つ関数があります。互いに#includeする2つのクラスのエラー

error: ISO C++ forbids declaration of 'Foo' with no type

私はクラスの両方をコンパイルするにはお互いに依存しているため、これは推測している。しかし、ときに私Foo#include "Bar.h"は、私はBarが上で参照されるライン上でこのエラーが出るBarを見ることがFooを可能にします。これを回避する方法はありますか?

EDIT:どちらのクラスも、#ifndef宣言の中で参照されるヘッダファイルを持っています。

+7

お互いのクラスを組み込む必要がある場合は、プログラムデザインを忘れてしまいます。ここは何かがおかしい。 –

+0

プリプロセッサの出力がどのようになるかを考えてください。どのように見えるべきかを解説します。これは、ヘッダーのどれに他のヘッダーを含める必要がないかを示す大きなステップです。 – hvd

+0

クラス本体がまだ表示されていない場合は、それを宣言する必要があります。ただし、クラスのオブジェクトは前方宣言だけで使用することはできません。そのオブジェクトを持つには、クラスの本文が可視である必要があります。 – iammilind

答えて

3

Bar.hの代わりにを使用する必要があります。これが機能するには、FooクラスのリファレンスまたはポインタとしてパラメータBarを使用する必要があることに注意してください。

+0

'struct bar;構造体foo {void frob(bar); }; '、' bar'は完全である必要はありません。メンバー変数を定義する必要があるときだけ、完全な型を持つ必要があります(そうしないと、コンパイラは 'foo'のサイズを計算できません)。 –

0

パラメータおよび前方宣言の参照またはポインタを使用します。例えば。

//foo.h 
class Bar;// the forward declaration 
class Foo { 
void myMethod(Bar*); 
}; 

//foo.cpp 
#include "bar.h" 
void Foo::myMethod(Bar* bar){/* ... */} 

//bar.h 
#include "foo.h" 
class Bar { 
    /*...*/ 
    Foo foo; 
}; 
0
class Foo; 

class Bar 
{ 

}; 

and 

class Bar; 
class Foo 
{ 
}; 

しかし、これは間違った設計の結果であるかもしれません!あなたは少なくとも1つのクラスのための前方宣言を使用する必要があります

+0

円形度のないクラスの束は、間違ったデザインの結果かもしれません。サーキュラリティは、悪いデザインのマーカーとして際立っていません。 – Kaz

+0

しかし、できればそれを回避しようとしているのではないのですか? –

0

がfoo.h:

#include "Bar.h" 

class Foo { 

}; 

Bar.h:

class Bar; 

#include "Foo.h" 

class Bar { 

}; 

またことを注意してくださいFoo.hのBarのメンバーを簡単に参照できません(宣言されていません)。したがって、Barを必要とするインラインメンバーは、Foo.cpp(または、必要に応じて.cc)に移動する必要があります。 Fooの値メンバーとしてバーを持つこともできません。

ので:

class Bar { 
    Foo f; // OK. Compiler knows layout of Foo. 
}; 

class Foo { 
    Bar b; // Nope. Compiler error, details of Bar's memory layout not known. 
    Bar *b; // Still OK. 
}; 

これは、テンプレートには特に注意が必要です。問題がある場合はFAQを参照してください。

関連する問題