在 C++ 中处理循环依赖

Handling circular dependencies in C++

所以,我知道有很多关于堆栈溢出的问题试图处理循环依赖。但是 none 可以真正回答我的问题,如果两个 class 可以互相认识,更重要的是,可以互相访问信息。所以,基本上,我读到过您可以使用前向减速,但是使用前向减速,我无法访问任何字段。

也许我还应该补充一点,我真的是 C++ 的新手。

但是说的够多了,让我们来看一个例子:

假设我们有一个名为 Scene 的 class 和一个名为 EntityBase 的 class,它们的定义如下:

EntityBase.h

#pragma once
#include <string>
#include "Scene.h"

class EntityBase
{
public:
    std::string entityId;
    Scene scene;


    EntityBase(std::string entityId);

    /* 
    This method will be called when this object is added to the scene 
    */
    void onAddedToScene(Scene* scene);

    /*
    This method will be called when this object is removed from the scene
    */
    void onRemovedFromScene(Scene* scene);
};

Scene.h

#pragma once
#include <vector>
#include <string>
#include "EntityBase.h"

class Scene
{
public:
    std::vector<EntityBase> entities;
    std::string name;

    Scene(std::string name);

    void addToScene(EntityBase& entityBase);
};

问题来了,

如何在 EntityBase 完全访问 Scene 的同时打印出 Scene 的名称(并使用 Scene 的每个方法)? 所以,如果您能告诉我如何做到这一点,我将不胜感激,因为稍后我可能需要访问每个字段 and/or 方法。

由于 C++17 标准,您不需要 Scene class 的完整 EntityBase class 定义,只需要一个 前向声明:

#pragma once
#include <vector>
#include <string>

class EntityBase;  // Forward declaration

class Scene
{
public:
    std::vector<EntityBase> entities;
    std::string name;

    Scene(std::string name);

    void addToScene(EntityBase& entityBase);
};

您当然需要在使用 entities 向量的任何地方包含 EntityBase.h,最值得注意的是 Scene.cpp 源文件。


由于 EntityBase 使用的是 Scene 的实际实例,因此您不能对 class 和 EntityBase.h 头文件执行相同的操作。这里必须包含 Scene.h 头文件。


如果您构建的目标是较早的 C++ 标准(C++14 或更早版本),那么您必须具有向量的 EntityBase class 的完整定义。

作为一种可能的解决方法,要么使 entities 成为 指向 EntityBase 的向量;或者使 EntityBase::scene 成为指针并在 EntityBase.h 头文件中使用前向声明。或者两者兼而有之。