2009-08-15 10 views

答えて

15

は、クロスのこの種です - 除外は禁止されていますか?

はい。

ワークアラウンド前方宣言は次のように、完全な宣言を含むのではなく、実行するようにmainwのIFR部材は、参照またはポインタであると言うことであろう。あるいは

//#include "IFr.h" //not this 
class IFr; //this instead 
... 
class mainw 
{ 
public: 
static IFr* ifr; //pointer; don't forget to initialize this in mainw.cpp! 
static CSize=100; 
... 
} 

別のヘッダーファイルにCSize値を定義します(Ifr.hはmainw.hをインクルードせずにこの他のヘッダーファイルを含めることができます)。

0

あなたのコードに巻き付け

#ifndef __MYHEADER_NAME_WHICH_IS_RANDOM_PER_FILE_H 
#define __MYHEADER_NAME_WHICH_IS_RANDOM_PER_FILE_H 
//... Code.. 
#endif 

を得た場合、あなたは:)

問題ないはず[EDIT]コードのスペル:O:P

+0

であるべきであると仮定します。この場合は役に立ちません。 – ChrisW

+0

これは本当にこの場合は役に立ちません。コンパイルする前に、mainwクラスがIfrクラスの完全な宣言を明確に見なければならないことは明らかです。 –

+0

どちらも正しいです。私はちょっと速すぎたと思います:) – cwap

4

このように、2つのクラスを組み込むことはできません。あなたはそれらのいずれかのポインタを作ることができる:

class foo; 

class bar 
{ 
    foo* fooPtr; 
} 

あなたがfooを構築し、バーのコンストラクタでfooPtrにそれを割り当て、デストラクタでそれを解放する必要があるだろう - それは間違いなく、もう少し仕事です。

または、この場合、コメント者の提案の1つとして、mainw :: sizeを定義して、どこかによく置きます。

1

このような再帰的なインクルードを行うことができますが、一般的には何らかのヘッダガードトリックを使用する必要があります。そうしないと、プリプロセッサは無限再帰に入ります。

class mainw 
{ 
public: 
static IFr ifr; // needs to see the full declaration of the Ifr class in order to know the size 
... 

class IFr 
{ 
public float[mainw::size]; // needs to see the full declaration of mainw in order to know what size is 

あなたが入れた1どんなに:あなたは、本質的に相互にコンパイルするために、他の完全な宣言を参照する必要がそれぞれの2つのクラスを、持っているので、これは本当に、あなたの根本的な問題を解決するのに役立ちません。まず、他のものの完全な詳細を知る必要があるため、コンパイルできません。

+0

そして、各クラスで他のクラスの詳細が必要なので、[前方宣言](http://stackoverflow.com/q/553682/1497596)は役に立ちません。しかし、クラス 'A'のインクルードファイルにポインタやクラスBへの参照しか含まれていない場合、クラス' A'のクラス 'B'への前方宣言はコンパイルを可能にします。 – DavidRR

1

円形介在物のそのようなものは、C++で許可されていないが、これは動作するはず:

代わりIFr.hを含める、前方宣言を使用します。

class IFr; 
class mainw 
{ 
    //... 
}; 

これはmainwコンパイルがうまくなりますが、ifrメンバーを使用して、すべてのコードがあまりにもIFr.hを含める必要があります。

これは、ifrstaticのメンバーであるためにのみ有効です。それ以外の場合は、コンパイラはifrの正確なサイズを知る必要があります。

他にも多くの人が言っていたように、同じヘッダーを2回含むことから生じるエラーを避けるために、両方のヘッダーの周りにガードを含める必要があります。あなたが行うことができます

#ifndef IFR_H 
#define IFR_H 
//... 
#endif 
1

// mainw.h 

#include "IFr.h" 
class mainw { 
public: 
    static const size_t CSize=100; 
    static IFr<CSize> ifr; 
... 
}; 

// IFr.h 
template <size_t Sz> 
struct IFr { 
    float sz_[Sz]; 
}; 

それともCSIZEが@ChrisWの答えが示すように、ポインタのソリューションを使用し、実行時に変更する必要がある場合は

関連する問題