gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:08:14 25 4
gpt4 key购买 nike

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

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