多个源目录中的前向声明;模板实例化

seg*_*ult 0 c++ templates forward-declaration

我正在寻找一本好书,参考材料,涉及类的前向声明,特别是。当源位于多个目录中时,例如。dirA 中的 A 类在 dirB 中的 B 类中向前声明?这是怎么做到的?

另外,有任何有关模板问题、高级用途和实例化问题的材料吗?

谢谢。

小智 5

前向声明与项目的目录结构无关。即使项目中不存在,您也可以转发声明。它们主要用于解决类之间的循环引用,以及在不需要完整的类声明时加快编译速度,相应的#include 可以用前向声明替换。

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

class Wheel;

class Car
{
    Wheel wheels[4];
};
Run Code Online (Sandbox Code Playgroud)

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

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

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

class Test;
pointer<Test> testpointer;
Run Code Online (Sandbox Code Playgroud)

是合法的,但是

std::vector<Test> testvector不会编译。

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

我不知道是否有关于这个主题的书,但你可以看到关于 c++ faq lite 的这一部分