2016-04-26 191 views
0

我对C++相对比较陌生,我正在尝试编写一个简单的2D引擎。但是,目前的结构在其他语言(AS3等)中还是有问题的。我有两个类,一个叫DisplayObject,另一个叫DisplayObjectContainer。 DisplayObjectContainer是DisplayObject的子类,但DisplayObject有一个指向DisplayObjectContainer父级的指针作为属性。我无法想出一种方法在他们的文件中正确包含对方。我无法在DisplayObject中转发声明DisplayObjectContainer,因为我需要访问DisplayObject中的DisplayObjectContainer方法。C++循环依赖关系

的DisplayObject:

class DisplayObject 
{ 
    public: 

     DisplayObjectContainer *parent; 
... 
    ...this->parent->globalTransform... 
... 

的DisplayObjectContainer:

class DisplayObjectContainer : public DisplayObject 
{ 
    public: 
     DisplayObjectContainer(); 
     virtual ~DisplayObjectContainer(); 

    protected: 

    private: 
}; 

任何帮助,将不胜感激。谢谢!

+0

首先,为什么父类知道一个特定的派生类?无论如何,你需要在包含'DisplayObject'的头文件中使用一个前向声明(它只包含一个未被解引用的DisplayObjectContainer *),并将include包含在源文件中(例如'DisplayObject.cpp ')为'DisplayObject'。 –

回答

1

有几种方法可以解决您的问题,最简单的就是简单地将DisplayObject分成单独的类和类实现。所以你有在头文件中定义的类,并且在单独的源文件中实现了成员函数。

这样DisplayObject的头文件不需要DisplayObjectContainer的头文件,所需要的只是DisplayObjectContainer类的前向声明。

像这样的事情在头文件

#pragma once 

// Forward declaration of the class 
class DisplayObjectContainer; 

class DisplayObject 
{ 
private: 
    DisplayObjectContainer *parent; 
    ... 
}; 

和源文件在你包含头文件:

#include "DisplayObject.h" 
#include "DisplayObjectContainer.h" 

// Here you can use the members of DisplayObjectContainer 

较硬的办法是改变设计,使DisplayObject实际上并不需要知道它存储在哪个容器中。从长远来看,这种解耦可能会更好,但如上所述需要重新设计您的项目。

+0

不应该仅仅因为重复而关闭? –

+0

谢谢!第一个建议解决了这个问题。对于第二个建议,我会考虑重新设计它,尽管我遵循的结构与Adobe Flash具有完全相同的结构。 – TommyX