在使用派生类时找到“循环包含”的方法

时间:2016-04-16 23:54:32

标签: c++ inheritance

基本上,我有一个名为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()

我尝试将其更改为材质向量,但随后它中断(由于某种原因使Visual Studio基本冻结,说它永远更新IntelliSense)当我将其更改为派生类“set”中的那个(Set派生自材料,DoubleDVD派生自Set)

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

您可以转发声明任何只使用指针或引用的类,而不是包含带有完整类型信息的.h文件。在使用DVD指针向量之前,只需键入class DVD;即可。前向声明基本上是告诉编译器“嘿,相信我,这种类型存在,当你真正需要这些信息时我会告诉你更多关于它的信息”。它的工作原理是因为指针(和引用,基本上只是花哨的指针)总是大小相同,所以编译器实际上并不需要任何其他信息来处理它们。

https://stackoverflow.com/a/4757718/493106

另外,通过将函数的代码放在.cpp文件中(如果可能的话 - 模板化的类方法有时不可能这样做),你可以摆脱很多情况,你最终会得到循环包含,因为什么都不应该是#include'ing .cpp文件。