处理循环对继承的依赖

时间:2012-02-27 15:41:09

标签: c++ class architecture 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

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指令不应该阻止这种包含问题吗?

提前致谢。

2 个答案:

答案 0 :(得分:6)

  

但是,在我的应用程序中,如果我只想在特定的代码片段中包含Actor.h,它将无法正常工作

您需要做的是在.cpp文件中,您需要使用定义Actor类,您必须include Actor.h 和< / em> Scene.h。这样,前方声明将得到解决,一切都应该有效。

另外,您应该在#ifndef之前将#defineinclude权限移到文件顶部。另外,在头文件中使用using是不好的做法,因为include您的标头可能无法正常工作的其他文件。可以把它放在你的namespace myns { ... }中。

答案 1 :(得分:1)

场景真的是一种演员吗?

如果是,演员可能不应该了解场景。基类通常不应该知道它们的派生类。

Liskov Substitution Principle在哪里?您对Actor执行了哪些操作,这些操作将由场景以不同方式执行。

在任何情况下,Scene都派生自Actor,因此必须包含其基类。但是在Actor.h中,如果你真的需要Scene类,它必须只是一个前向声明。

在编译单元(.cpp文件)中,如果需要,您可以包含两个标头。