私はこの上でC++übern00bに行き、継承があるときに循環依存を処理する最良の方法がどのようになるか尋ねます。継承に循環依存関係を扱う
セットはシンプルです:シーンクラスはActorを拡張します。シーンには、アクタのベクトルへのポインタがあります。 Actorには(親)Sceneのポインタがあります。
Scene.h:
#include <string>
#include <vector>
using namespace std;
#ifndef __Scene_h__
#define __Scene_h__
#include "Actor.h"
namespace myns
{
// class Actor;
class Scene;
}
namespace myns
{
class Scene: public myns::Actor
{
/* private class attributes... */
public:
/* public class attributes... */
std::vector<myns::Actor*> actors;
Scene(/* arguments */);
/* public class methods... */
};
}
#endif
Actor.h
#include <string>
#include <vector>
using namespace std;
#ifndef __Actor_h__
#define __Actor_h__
#include "Scene.h"
namespace myns
{
// class Scene;
class Actor;
}
namespace myns
{
class Actor
{
/* private class attributes... */
public:
/* public class attributes... */
myns::Scene* scene;
Actor();
Actor(/* arguments */);
/* public class methods... */
};
}
#endif
しかし、これはC2504エラー/ベースクラスのたくさんビジュアルに未定義の私を与えるためとして
は、私が得たファイルを含めますStudio 2010.
Actor.hのScene.hのインクルードにコメントして、 Actor.h上のシーンの明確化、それは動作しますが、私のアプリケーションでは、Actor.hだけを特定のコードに含めると機能しません。以前は手動でScene.hを含める必要なしにActor.hを含むActor.hの包含関係を維持しながら、これをどのように動作させることができますか?
私のクラス定義には何が問題なのですか?この循環依存関係を処理する最良の方法は?
#ifndefディレクティブはこの組み込みの問題を防ぐことはできませんか?
ありがとうございます。
Actor.h(Actor.hが依存関係を気にする必要がある)だけが必要なときに、Actor.hを含めることができるようにクラスを宣言できる方法はありますか? この依存関係の委任は標準的なC++のプラクティスですか? これらのすべてのクラスがライブラリの一部であると仮定すると、これらのすべてを適切な順序で、次にLibray.hを含む私のアプリケーションに含めるLibrary.hを作成することをお勧めしますか? – pedrosanta
Act.cで除いて 'Actor'を使うために両方のファイルを含める必要がある状況は本当にありません。そうしないとActor.hで' Scene'を使うことになります。 veは前方宣言しか得ていない。 – spencercw
ああ、私は最後のコメントを持っています。はい、それは意味があり、よく指摘されています。 – pedrosanta