gpt4 book ai didi

c++ - 如何使用 has-a 关系解决模板化循环依赖?

转载 作者:行者123 更新时间:2023-11-28 06:09:40 25 4
gpt4 key购买 nike

我有一个名为 EntityManager 的类,它在 vector 中拥有 Entity。问题是,Entity 在模板函数中使用了对 EntityManager 的引用。这是演示我的意思的代码:

//EntityManager.h
#include "Entity.h"
class EntityManager{
std::vector<Entity> ents;
public:
template<class T>
void someFunc(const Entity & e){
...
}
};

//Entity.h
#include "EntityManager.h"
class Entity{
EntityManager * mgr;
public:
template<class T>
void someOtherFunc(){
mgr->someFunc<T>(*this);
}
}

请注意,我曾尝试将函数移出声明,如下所示:

//Entity.h
class EntityManager;

class Entity{
EntityManager & mgr;
public:
template<class T>
void someOtherFunc();
}

#include "EntityManager.h"
template<class T>
void Entity::someOtherFunc(){
mgr->someFunc<T>(*this);
}

如何解决这种依赖关系?请注意,我不能使用 C++11,以防万一解决方案隐藏在那里。

最佳答案

看起来你的依赖如下:

  • EntityManager包含 vectorEntity秒。 EntityManager 的类定义需要 Entity 的类定义为了明确定义。
  • Entity包含对 EntityManager 的引用.它的类定义需要EntityManager的类型声明为了明确定义。
  • 实现EntityManager::someFunc<T>需要 EntityManager 的类定义和 Entity .
  • 实现Entity::someOtherFunc<T>还需要 EntityManager 的类定义和 Entity .

所以,解决方案是:

  • 包含 Entity 的类定义之前EntityManager
  • 转发声明EntityManagerEntity 的类定义之前
  • 包含 EntityManager 的类定义在 Entity 的类定义之前
  • 但要记住包含 EntityManager 的类定义在执行 Entity::someOtherFunc<T> 之前,以及 Entity 的类定义在执行 EntityManager::someFunc<T> 之前

这应该会打破循环。关键的见解是,虽然您通常可以通过内联编写成员函数模板,但在这种情况下,您必须将它们从类定义中分离出来。如果您以声明方式表达依赖关系并使用适当的 #include守卫,定义将自动包含在正确的顺序中。

例如,

EntityManager.h

EntityManager 的类定义需要 Entity 的类定义. header 需要包含 EntityManager 的实现的模板化成员函数。

#ifndef ENTITYMANAGER_H
#define ENTITYMANAGER_H
#include "Entity.h"

class EntityManager {
std::vector<Entity> ents;
public:
template <typename T>
inline void someFunc(const Entity &e);
};

#include "EntityManager.cpp.tmpl"

#endif

EntityManager.cpp.tmpl

执行EntityManager需要 Entity 的类定义.

#include "Entity.h"

template <typename T>
void EntityManager::someFunc(const Entity &e) {
// do things with this, e, and T
}

实体.h

Entity 的类定义只需要声明 EntityManager类型。 header 需要包含 Entity 的实现的模板化成员函数。

#ifndef ENTITY_H
#define ENTITY_H
class EntityManager;

class Entity {
EntityManager &mgr;
public:
template <typename T>
inline void someOtherFunc();
};

#include "Entity.cpp.tmpl"

#endif

实体.cpp.tmpl

执行Entity需要 EntityManager 的类定义.

#include "EntityManager.h"

template <typename T>
void Entity::someOtherFunc() {
mgr.someFunc<T>(*this);
}

关于c++ - 如何使用 has-a 关系解决模板化循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31529129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com