enqueue_list_; } /-6ren">
gpt4 book ai didi

c++ - C++ 中交叉依赖类的最佳实践

转载 作者:搜寻专家 更新时间:2023-10-30 23:58:16 24 4
gpt4 key购买 nike

我有两个像这样相互依赖的类:

// model.h
#include "facet.h"
class Model {
...
std::map<int, std::vector<Facet*> > enqueue_list_;
}

// facet.h
#include "model.h"
class Facet {
...
Model *parent_;
}

编译器在尝试编译它时显然非常沮丧。我已经用这样的前向类声明修复了它:

// model.h
#include "facet.h"
class Facet;
class Model {
...
std::map<int, std::vector<Facet*> > enqueue_list_;
}

// facet.h
#include "model.h"
class Model;
class Facet {
...
Model *parent_;
}

但我不喜欢这样做。这对我来说似乎很乱而且很难维护。我认为这类问题可以通过使用头文件来解决。有没有更好的方法来解决我缺少的问题?我很乐意不必在其他类头文件中转发声明类。我觉得我在这里错过了一些重要的东西。如果我仍然收到交叉依赖投诉,头文件到底有什么意义?
提前致谢,
最大

编辑

感谢您的快速回复。我接受了建议并删除了头文件中的包含,并完全切换为前向声明。如果类直接像这样分配类,我假设我仍然需要实际包含标题是正确的:

// facet.h
#include "point.h"
class Facet {
...
private:
Point normal_;
}

我在此处尝试使用前向声明时遇到错误。这确实是我必须 #include 的情况吗?

最佳答案

你不应该是#include荷兰国际集团在所有。由于您只存储指针,因此不需要类的完整定义——您只需要声明。只需自己使用前向声明:

// model.h
class Facet;

class Model {
...
std::map<int, std::vector<Facet*> > enqueue_list_;
}

// facet.h
class Model;

class Facet {
...
Model *parent_;
}

头文件的要点是能够在多个翻译单元中重用函数和对象的声明以及类的定义。在这种情况下,您不需要类的定义,只需要声明。

正如您最初拥有的那样,model.h将包括 facet.h将包括 model.h将包括 facet.h ...这显然会导致无限递归包含。如果您在 header 中包含守卫,无限递归将被阻止,但其中一个类将不知道另一个类。例如,如果 model.h首先进行预处理,它将包括facet.h并能够看到 Facet 的定义,然后 facet.h将无法包含 model.h (因为包含保护)所以它对 Model 一无所知.

关于c++ - C++ 中交叉依赖类的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21134873/

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