处理循环对继承的依赖

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

提前致谢.

spe*_*rcw 6

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

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

顺便说一句,你应该将你#ifndef#define权利文件的顶部,前include秒.此外,using在头文件中使用是不好的做法,因为include您的标头可能无法正常工作的其他文件.它可以放在你的内部namespace myns { ... }.