我有两个类(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/