ped*_*nta 2 c++ architecture class circular-dependency
我将在这个问题上使用C++übernbb,并询问在继承时如何处理循环依赖关系是最好的方法.
设置很简单:Scene类扩展了Actor; 场景有一个指向Actors矢量的指针; Actor有(父)场景的指针.
至于我得到的包含文件:
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
但这给了我很多在Visual Studio 2010上未定义的C2504错误/基类.
如果我在Actor.h上注释Scene.h include并取消注释Actor.h上的Scene的前向声明它可以工作,但是,在我的应用程序中,如果我想在特定的代码段上只包含Actor.h , 不起作用.如何在保持Actor.h的包含独立性的同时将其用于工作 - 包括Actor.h而无需先前手动包含Scene.h?
我的类定义有什么问题,处理这种循环依赖的最佳方法是什么?
#ifndef指令不应该阻止这种包含问题吗?
提前致谢.
但是,在我的应用程序中,如果我只想在特定的代码片段中包含Actor.h,它将无法工作
您需要做的是在您需要的.cpp文件中 使用定义Actor您必须include同时使用Actor.h 和 Scene.h的类.这样,前方声明将得到解决,一切都应该有效.
顺便说一句,你应该将你#ifndef和#define权利文件的顶部,前include秒.此外,using在头文件中使用是不好的做法,因为include您的标头可能无法正常工作的其他文件.它可以放在你的内部namespace myns { ... }.