3

C ++では、ダブルインクルードに問題があります。

ファイルstuffcollection.h

#pragma once
#ifndef STUFFCOLLECTION_H
#define STUFFCOLLECTION_H

#include "Stage.h"

class Stuffcollection {
    public:
        bool myfunc( Stage * stage );
};

#endif // STUFFCOLLECTION_H

ファイルstage.h:

#pragma once
#ifndef STAGE_H
#define STAGE_H

#include "Stuffcollection.h"

class Stage {
    // stuffcollection used in stage.cpp
};

#endif // STAGE_H

コンパイラエラー:

\Stuffcollection.h|(line were bool myfunc is declared)|error: 'Stage' has not been declared| ||=== Build finished: 1 errors, 0 warnings ===|

誰かがこれが起こる理由とそれを解決する方法を説明できますか?私はすでにインクルードガードとプラグマ一度プリプロセッサディレクティブを使用していますが、それは機能しません。

(stage.hから削除#include "Stuffcollection.h"し、stage.cppでそれを使用しているそれぞれの行をコメントアウトすると、残りのコードは正常に機能します。Stuffcollectionをステージに含めると、突然機能しなくなります。)

PS:ステージはほんの一例です。私は他のほとんどすべてのファイルでもstuffcollectionを使用しており、この問題が発生するたびに使用しています。

編集:私は提案されたものに従いました、そして今問題はですinvalid use of incomplete type、すなわち与えられた答えは循環依存の問題を解決しますが、私が扱っている問題を解決しません。私の問題は循環依存/不完全なタイプで続いています。

編集:両方とも解決しました。

4

3 に答える 3

14

Circular Dependencyがあります。代わりに前方宣言を使用してくださいStuffcollection.h

#pragma once
#ifndef STUFFCOLLECTION_H
#define STUFFCOLLECTION_H

//#include "Stage.h"      //<------------------Don't Do This
class Stage;              //<------------------Do This

class Stuffcollection {
    public:
        bool myfunc( Stage * stage );
};

#endif // STUFFCOLLECTION_H

根拠:
上記のスニペットで forward 宣言を使用できます。これは、へのStuffcollection.hポインターのみを使用するためStageです。

説明:
class の前方宣言を使用するStageと、コンパイラはその構成もその内部のメンバーも認識せず、それが . であることのみを認識しStageますtype。したがって、 コンパイラStage不完全型です。Incomplete types では、そのオブジェクトを作成したり、コンパイラが単なる型でStageあるという事実以上のレイアウトを知る必要があることを行うことはできません。Stageすべてのオブジェクトへのポインターは同じメモリ割り当てを必要とするためStage、ポインターとして参照するだけの場合は前方宣言を使用できます。

前方宣言を使用して、循環依存の問題を解決できます。

さらに読む:
いつ前方宣言を使用するのですか?

于 2011-10-05T18:31:19.717 に答える
6

これは循環依存です。それらを作らないでください。#include "Stage.h"これは、stuffcollection.h を前方宣言Stage(つまり)に置き換えることで解決できますclass Stage;

于 2011-10-05T18:31:04.320 に答える
3

の代わりに前方宣言、つまりと#includeを使用できます。また、依存関係を減らすという利点もあります。class Stage;class Stuffcollection

于 2011-10-05T18:31:06.647 に答える