在 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
头文件中使用前向声明。或者两者兼而有之。
所以,我知道有很多关于堆栈溢出的问题试图处理循环依赖。但是 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
头文件中使用前向声明。或者两者兼而有之。