c++ - 模板类具有循环依赖

标签 c++ templates

我有两个类(class)。一个是管理类,里面存放了一堆 worker 类。 worker 实际上是一个模板类。

#include "worker.h"    
class Management {

     private: 
      worker<type1> worker1;
      worker<type2> worker2;
      ...

};

问题的出现是因为模板类需要使用管理。

例子:

class Worker{
   ...
};

#include "Worker.inl"

Worker inl 文件:

#include "Management.h"  //Circular Dependency!

Worker::Worker(){
    //Management is accessed here
    Management mgmt1();
    mgmt1.doSomething(); //Can't use that forward declaration!
}
...

通常您会在 Worker 头文件中转发声明 Management.h,然后收工。遗憾的是,由于该类是模板化的,它总是会被包含在内。

我猜你可以说这个设计很糟糕,因为如果一个模板化类需要知道这类信息,它就不应该被模板化,但它就是这样,我必须使用它。

你也可以把这个问题看作是办公室生活的一个缩影。

最佳答案

如果 worker.inl 没有引用 Management 的实际成员(即只有指向 Management 的指针/引用),您可以转发声明它:

class Management;

Worker::Worker(){
    Management* mgmt1; // fine
    Management& mgmt2; // fine
    //mgmt1 = new Management(); // won't compile with forward declaration
    //mgmt2.doSomething(); // won't compile with forward declaration
}

否则,您唯一的选择可能是将方法实现移动到 cpp 文件中,而不是包含在 header 中。

请注意,Worker 不能向前声明,因为它包含在 Management 中的值中:

  worker<type1> worker1;

因此编译器此时需要知道它的完整定义。

你还应该考虑将两个类定义放在同一个头文件中,以表达它们相互依赖,从而形成一个组件

关于c++ - 模板类具有循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3548516/

相关文章:

c++ - 为 std::index_sequence 使用默认参数

c++ - 如何正确声明模板类的嵌套类的友元?

c++ - X x(t...) 是否会导致带有令人烦恼的解析的函数声明?

c++ - 如何计算编辑控件中的总数 - Visual MFC

c++ - Chrono 程序中永远不会触发条件语句

c++ - 有没有办法在对象上保持弱引用并控制它的生命周期?

c++ - 查找模板参数的 typeid

c++ - Qt 修改 JSON 文件

c++ - gcc 可以编译可变参数模板而 clang 不能

c++ - 实现动态插件管理器