C++ 循环依赖
C++ Circular Dependencies
我对 C++ 比较陌生,我正在尝试编写一个简单的 2D 引擎。但是,当前结构存在问题,而在其他语言(AS3 等)中是可以的。我有两个 类,一个叫 DisplayObject,另一个叫 DisplayObjectContainer。 DisplayObjectContainer 是 DisplayObject 的子类,但 DisplayObject 有一个指向 DisplayObjectContainer 父类的指针 属性。我想不出一种方法来将彼此正确地包含在他们的文件中。我无法在 DisplayObject 中转发声明 DisplayObjectContainer,因为我需要在 DisplayObject 中访问 DisplayObjectContainer 的方法。
显示对象:
class DisplayObject
{
public:
DisplayObjectContainer *parent;
...
...this->parent->globalTransform...
...
显示对象容器:
class DisplayObjectContainer : public DisplayObject
{
public:
DisplayObjectContainer();
virtual ~DisplayObjectContainer();
protected:
private:
};
如有任何帮助,我们将不胜感激。谢谢!
有几种方法可以解决您的问题,最简单的方法是将 DisplayObject
拆分为单独的 class 和 class 实现。因此,您在头文件中定义了 class,并在单独的源文件中实现了成员函数。
这样 DisplayObject
的头文件就不需要 DisplayObjectContainer
的头文件了,只需要 DisplayObjectContainer
class 的前向声明。
头文件中有这样的东西
#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
实际上不需要知道它存储在哪个容器中。这种解耦可能在长期 运行 中更好,但如前所述,需要重新设计您的项目。
我对 C++ 比较陌生,我正在尝试编写一个简单的 2D 引擎。但是,当前结构存在问题,而在其他语言(AS3 等)中是可以的。我有两个 类,一个叫 DisplayObject,另一个叫 DisplayObjectContainer。 DisplayObjectContainer 是 DisplayObject 的子类,但 DisplayObject 有一个指向 DisplayObjectContainer 父类的指针 属性。我想不出一种方法来将彼此正确地包含在他们的文件中。我无法在 DisplayObject 中转发声明 DisplayObjectContainer,因为我需要在 DisplayObject 中访问 DisplayObjectContainer 的方法。
显示对象:
class DisplayObject
{
public:
DisplayObjectContainer *parent;
...
...this->parent->globalTransform...
...
显示对象容器:
class DisplayObjectContainer : public DisplayObject
{
public:
DisplayObjectContainer();
virtual ~DisplayObjectContainer();
protected:
private:
};
如有任何帮助,我们将不胜感激。谢谢!
有几种方法可以解决您的问题,最简单的方法是将 DisplayObject
拆分为单独的 class 和 class 实现。因此,您在头文件中定义了 class,并在单独的源文件中实现了成员函数。
这样 DisplayObject
的头文件就不需要 DisplayObjectContainer
的头文件了,只需要 DisplayObjectContainer
class 的前向声明。
头文件中有这样的东西
#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
实际上不需要知道它存储在哪个容器中。这种解耦可能在长期 运行 中更好,但如前所述,需要重新设计您的项目。