使用派生类时找到绕过"circular include"的方法

Finding my way around a "circular include" when using derived classes

本文关键字:circular include 方法 派生      更新时间:2023-10-16

基本上,我有一个名为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文件不应该包含任何内容。