が含まれていますstatic IFr ifr;
行でエラーが発生しました。この種のクロス包含は禁じられていますか?円形C++ヘッダーは、私は2つのクラスを持っているプロジェクトで
答えて
は、クロスのこの種です - 除外は禁止されていますか?
はい。
ワークアラウンド前方宣言は次のように、完全な宣言を含むのではなく、実行するように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をインクルードせずにこの他のヘッダーファイルを含めることができます)。
あなたのコードに巻き付け
#ifndef __MYHEADER_NAME_WHICH_IS_RANDOM_PER_FILE_H
#define __MYHEADER_NAME_WHICH_IS_RANDOM_PER_FILE_H
//... Code..
#endif
を得た場合、あなたは:)
問題ないはず[EDIT]コードのスペル:O:P
このように、2つのクラスを組み込むことはできません。あなたはそれらのいずれかのポインタを作ることができる:
class foo;
class bar
{
foo* fooPtr;
}
あなたがfooを構築し、バーのコンストラクタでfooPtrにそれを割り当て、デストラクタでそれを解放する必要があるだろう - それは間違いなく、もう少し仕事です。
または、この場合、コメント者の提案の1つとして、mainw :: sizeを定義して、どこかによく置きます。
このような再帰的なインクルードを行うことができますが、一般的には何らかのヘッダガードトリックを使用する必要があります。そうしないと、プリプロセッサは無限再帰に入ります。
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つのクラスを、持っているので、これは本当に、あなたの根本的な問題を解決するのに役立ちません。まず、他のものの完全な詳細を知る必要があるため、コンパイルできません。
そして、各クラスで他のクラスの詳細が必要なので、[前方宣言](http://stackoverflow.com/q/553682/1497596)は役に立ちません。しかし、クラス 'A'のインクルードファイルにポインタやクラスBへの参照しか含まれていない場合、クラス' A'のクラス 'B'への前方宣言はコンパイルを可能にします。 – DavidRR
円形介在物のそのようなものは、C++で許可されていないが、これは動作するはず:
代わりIFr.hを含める、前方宣言を使用します。
class IFr;
class mainw
{
//...
};
これはmainw
コンパイルがうまくなりますが、ifr
メンバーを使用して、すべてのコードがあまりにもIFr.hを含める必要があります。
これは、ifr
がstatic
のメンバーであるためにのみ有効です。それ以外の場合は、コンパイラはifr
の正確なサイズを知る必要があります。
他にも多くの人が言っていたように、同じヘッダーを2回含むことから生じるエラーを避けるために、両方のヘッダーの周りにガードを含める必要があります。あなたが行うことができます
#ifndef IFR_H
#define IFR_H
//...
#endif
:
// 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の答えが示すように、ポインタのソリューションを使用し、実行時に変更する必要がある場合は
。- 1. C#が、私は2つのクラスを持っているIGrouping
- 2. C++/CLI:私はC++/CLIで2つのREFクラスを持っている財産
- 3. Androidのネイティブプロジェクトは、私は2つのプロジェクトを持っているC++ライブラリプロジェクト
- 4. は、私は2つのクラスを持っている財産
- 5. @jsonbackreferenceは、私は2つのクラスを持っている関係
- 6. 必須フィールドは、私は2つのクラスを持っている
- 7. は、私は2つのクラスを持っているマッピング配列
- 8. 私は2つのインターフェイス持っている匿名クラスで
- 9. のForeignKey、私は2つのクラスを持っているテンプレート
- 10. コンストラクタは、私は私のクラスでは2つのコンストラクタ持っているのpython
- 11. 私は2つのテーブルを持っている各クラス
- 12. は、私は、このディレクトリ構造を持つC++プロジェクトを持っている
- 13. は、私はこれらの2つのクラスを持っている外部クラス
- 14. シェアは、私は2つのプロジェクトを持っている2つの異なるプロジェクト間
- 15. C++私は2つの質問を持っているファイル
- 16. 私は2つのクラスを持って互いに
- 17. は、私はJavaで2つのクラスを持っているのjava
- 18. アクセスXAMLは、私は私のVSプロジェクトの2つのファイルを持っているC#コードビハインド
- 19. は、私は、ディスク上のVisual C++プロジェクトを持っている.gitignore
- 20. Androidの開発:私は私のプロジェクトでは2つのクラスを持って情報を渡し、
- 21. インターン - 私は2つの機能スイートでプロジェクトを持っている
- 22. デザイナーは、私は2つの形態を持っている参照「Microsoft.WindowsCE.Forms」
- 23. インポートのjarファイルは、私は2つのプロジェクトを持ってMavenプロジェクト
- 24. エラー、私は私のモデルに2つのクラスを持っている
- 25. ナビゲーションは、私は私のデータベース内の2つのエンティティ持っているC#の
- 26. は、私は2つのクラスを持っている多くの関係のAndroid
- 27. Grailsの1は、私は、この2つのクラスを持っている子供
- 28. は[、TABLE1表2]私は2つのテーブルを持っている
- 29. 私は2クラス持っ
- 30. は、私は2クラスを持っている別の
私はそれがmainw :: CSize –