使用派生类时找到绕过"circular include"的方法
Finding my way around a "circular include" when using derived classes
基本上,我有一个名为materials的基类。材料有许多虚拟功能,其中一个被称为"双DVD"(这是一种材料,但由两个DVD组成,这是另一种材料)。
所以一开始我想把它作为一对/向量存储在一个名为"Set"的派生类中,并在material.h中定义一个虚拟函数,该函数将返回指向存储的两个(或多个)DVD对象的指针向量。
virtual std::vector<DVD *> getPointers() { return std::vector<DVD *>(); }
然而,问题是,这需要将"DVD.h"包含在Materials.h中,如下所示:
#ifndef CWK_MAT_H
#define CWK_MAT_H
#include "DVD.h"
#include <string>
#include <vector>
namespace MATERIALS
{
这导致代码以惊人的方式崩溃。有什么办法绕过这个问题吗?我需要虚拟方法来获得Materials类中的指针,这样我就可以从这个向量访问它:
std::vector<Material *> vect;
如
vect[1]->getPointers()
我试图将它更改为材质向量,但当我将其更改为派生类"set"(set派生自材质,DoubleDVD派生自set)中的向量时,它就坏了(由于某种原因,Visual Studio基本上冻结了,说它将永远更新IntelliSense)
有办法做到这一点吗?
您可以转发声明任何只使用指针或引用的类,而不包括包含完整类型信息的.h文件。在使用DVD指针的矢量之前,只需键入class DVD;
。正向声明基本上是告诉编译器"嘿,相信我,这种类型存在,当你真正需要这些信息时,我会告诉你更多关于它的信息"。它之所以有效,是因为指针(和引用,基本上只是花哨的指针)总是相同的大小,所以编译器实际上不需要更多的信息来处理它们。
https://stackoverflow.com/a/4757718/493106
此外,通过将函数的代码放在.cpp文件中(在可能的情况下,模板化的类方法有时不可能做到这一点),您可以摆脱许多最终使用循环include的情况,因为.cpp文件不应该包含任何内容。
- 既然存在危险,为什么项目要使用-I include开关
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 如何将更多文件夹添加到c++include路径
- 什么是"#include <boost/functional/hash.hpp> "?
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- C++包含来自 #include "DevEngine/Core.h" 的错误
- <filesystem> 在 clang 6 和 10 上 #include 错误
- 在 void 函数中使用 #include 变量C++
- N-API include an .so or dll
- 允许哪些令牌作为 #include 的参数?
- GCC 包含标头(使用"-include")CMake 未检测到的更改
- WebAssembly include OpenCV
- 如何在 c++ 中正确指定 #include 路径以使程序可移植
- 修改生成文件以简化框架 #include 路径
- VS2015/VC++ 在新类模板中禁用默认 #include "stdafx.h"
- macOS 致命错误:sys/_types/_int8_t.h:没有此类文件或目录 #include < sys/_types/_int8_t.h>
- #include < conio.h> 和 getch() 方法之间的关系是什么?
- 如何将构建的C++库安装到 /usr/include?
- /usr/include/c++/7/cstdlib:75:15:致命错误:stdlib.h:没有这样的文件或目录 #i
- 使用派生类时找到绕过"circular include"的方法