多源目录中的转发声明;模板实例化

时间:2009-07-23 14:46:27

标签: c++ templates forward-declaration

我正在寻找一本好书,参考资料来处理类esp的前向声明。当源在多个目录中时,例如。 dirA中的A类是在dirB中的B类中向前声明的吗?这是怎么做到的?

此外,模板问题,高级用途和即时问题的任何材料都是高度适用的?

感谢。

3 个答案:

答案 0 :(得分:4)

前向声明与项目的目录结构无关。您可以转发声明甚至不存在于项目中的内容。它们主要用于解析类之间的循环引用,并在不需要完整的类声明时加速编译,并且相应的#include可以用前向声明替换。

要确定前向声明何时足够,sizeof()查询通常可以回答问题。例如,

class Wheel;

class Car
{
    Wheel wheels[4];
};

在此声明中,由于编译器无法确定Car的大小,因此无法使用前向声明:它不知道轮子包含多少数据。换句话说,sizeof(Car)未知。

同样关于模板,如果模板类包含模板参数的数据成员(但它们的指针可以是),则前向声明的类不能用作模板参数。例如,

template<class T> class pointer
{
    T *ptr;
};

class Test;
pointer<Test> testpointer;

合法,但

std::vector<Test> testvector无法编译。

由于上述限制,前向声明的类通常用作指针或引用。

我不知道是否有关于这个主题的书,但你可以在c ++ faq lite上看到this section

答案 1 :(得分:1)

如果它们在并行目录中,则可以包含它,如

#include "../dirB/B.h"

但是在标题中你只需要将此行称为前向删除

class B;

而不是这个,你可以分开你的包含目录和源目录。

所以你可以将include目录显示为这个目录,你可以通过调用

添加标题
#include "dirB/B.h"

因为你将在标题上进行前向删除,所以不会有问题。

答案 2 :(得分:1)

一般来说,您可以在标题中转发声明作为避免完全包含的方法或作为启用循环引用(错误)的方法。 您可以通过指针或引用或仅返回类型来使用前向声明的类型。

John Lakos的大规模C ++软件设计(book review here)解决了物理设计(文件)和逻辑设计以及它们与软件组件的关系(它们与类的关系并不总是1:1)。