我将在这个问题上使用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
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
但是这给了我很多在Visual Studio 2010上未定义的C2504错误/基类。
如果我在Actor.h上注释Scene.h include并取消注释Actor.h上的Scene的前向声明它可以工作,但是,在我的应用程序中,如果我想在特定的某个上只包含Actor.h一段代码,它将无法正常工作。如何在保持Actor.h的包含独立性的同时使用它 - 包括Actor.h而不需要先手动包含Scene.h?
我的类定义有什么问题?处理这种循环依赖的最佳方法是什么?
#ifndef指令不应该阻止这种包含问题吗?
提前致谢。
答案 0 :(得分:6)
但是,在我的应用程序中,如果我只想在特定的代码片段中包含Actor.h,它将无法正常工作
您需要做的是在.cpp文件中,您需要使用定义Actor
类,您必须include
Actor.h 和< / em> Scene.h。这样,前方声明将得到解决,一切都应该有效。
另外,您应该在#ifndef
之前将#define
和include
权限移到文件顶部。另外,在头文件中使用using
是不好的做法,因为include
您的标头可能无法正常工作的其他文件。可以把它放在你的namespace myns { ... }
中。
答案 1 :(得分:1)
场景真的是一种演员吗?
如果是,演员可能不应该了解场景。基类通常不应该知道它们的派生类。
Liskov Substitution Principle在哪里?您对Actor执行了哪些操作,这些操作将由场景以不同方式执行。
在任何情况下,Scene都派生自Actor,因此必须包含其基类。但是在Actor.h中,如果你真的需要Scene类,它必须只是一个前向声明。
在编译单元(.cpp文件)中,如果需要,您可以包含两个标头。