我正在寻找一本好书,参考材料,它处理类的前向声明,尤其是。当源位于多个目录中时,例如。dirA 中的 A 类在 dirB 中的 B 类中前向声明?这是怎么做的?
此外,对于模板问题、高级用途和实例化问题的任何材料,是否受到高度评价?
谢谢。
我正在寻找一本好书,参考材料,它处理类的前向声明,尤其是。当源位于多个目录中时,例如。dirA 中的 A 类在 dirB 中的 B 类中前向声明?这是怎么做的?
此外,对于模板问题、高级用途和实例化问题的任何材料,是否受到高度评价?
谢谢。
前向声明与项目的目录结构无关。您可以转发声明甚至在您的项目中不存在的内容。它们主要用于解决类之间的循环引用,并在不需要完整的类声明时加速编译,相应的#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 上查看此部分。
如果它们在并行目录中,您可以像这样包含它
#include "../dirB/B.h"
但是在标题中,您只需将此行称为前向减速
class B;
取而代之的是,您可以将包含目录和源目录分开。
所以你可以将包含目录显示为这个目录,你可以通过调用添加标题
#include "dirB/B.h"
因为你会在头球上做一个前向减速,这不会是问题。
一般来说,您可以在标头中转发声明作为避免完全包含的一种方式或作为启用循环引用(坏)的一种方式。您只能通过指针或引用或返回类型使用前向声明的类型。
John Lakos 的大型 C++ 软件设计(此处为书评)解决了物理设计(文件)和逻辑设计以及它们与软件组件的关系(与类并不总是 1:1)。