C++ 循环依赖

标签 c++ include circular-dependency

<分区>

我是 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 拆分为单独的类和类实现。因此,您在头文件中定义了类,并在单独的源文件中实现了成员函数。

这样,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 实际上不需要知道它存储在哪个容器中。从长远来看,这种解耦可能会更好,但如前所述,需要重新设计您的项目。

关于C++ 循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36854667/

相关文章:

c++ - 在 direct3d11 中映射资源和分配数据

c++ - 在 lambda 中捕获 vector 数组使元素常量

eclipse - 在其他 Perl 模块中使用 Perl 自定义模块的正确方法

c++ - 内联文件之间的循环依赖

javascript - 避免 Node require() 的循环依赖?

c++ - 小双数的总和c++

c++ - 在C++中使用 “using”

c++ - 当我尝试在 vs 2019 中使用 std::filesystem 时出现错误

include - #pragma once 与 #if !defined MYHEADER_INCLUDED_

c++ - 实现 C++ 访问者模式避免循环依赖