C++中的前置声明(Forward Declaration)

兜兜转转,因为要做Qt的项目,又要重新拾起C++这个对于我来说是启蒙语言的编程工具了。

因为是第一次自己负责设计项目的架构,显得有些激动和有点迷茫。不过还好,感觉自己慢慢挺过来。基本的结构设计文档已写完和基本的工程框架已经搭好,很快就可以进入正式的编码阶段。


今天写模块类文件的一个收获是,在定义头文件时,能依赖前置声明的就不要依赖定义,同时在适当的情况下应该用类型的前置声明来减少头文件的导入。例如,在头文件中定义类的一个指针成员时,该指针是工程中另外定义的类型class Account的一种指针Account* m_Account;。那么在该头文件的类声明之前加上前置声明:

class Account;
就OK了,而不需要将Account所在的头文件包含进来: 

#include "account.h"   // 前置声明代替了这种导入方式

这样做有什么好处呢?

使用前置声明可以减少需要包含的头文件。而当一个头文件被包含进来时,相当于引入了新的依赖。只要被依赖的这个头文件有修改,代码就会重新编译。而在这种依赖性是会递归传递的,也就是包含了头文件A的头文件B,当头文件A发生了更改时,头文件B和所有包含头文件B的头文件都会被重新编译。所以应该适当地减少这种情况的发生。


但是使用类型的前置声明是有条件的。假设有一个类Test,那么如果你的类中如果有定义类型为Test的非静态成员,抑或你的类继承了Test的话,就必须要包含Test所在的头文件,而不能使用类Test的前置声明。大概有三种情况可以使用到类Test而不用访问到Test的定义体:

(1)参数或返回类型为Test的函数声明;

(2)类型为Test的类静态成员;

(3)类成员变量声明为Test* 或 Test&;


进步源于总结,温故而知新,这可是真理~

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ ,可以使用类的声明前置forward declaration)来解决互相依赖的类之间的编译问题。类的声明前置可以让编译器知道某个类的存在,而无需包含该类的头文件。 具体来说,如果一个类 A 依赖于另一个类 B,而类 B 又依赖于类 A,那么在定义这两个类时,就会产生循环依赖的问题。此时,我们可以使用类的声明前置来解决这个问题。 例如,假设有两个类 `ClassA` 和 `ClassB`,它们互相依赖,可以这样来声明前置: ```cpp // ClassA.h 文件 #pragma once // 前置声明 ClassB class ClassB; class ClassA { public: void func(ClassB* b); }; // ClassB.h 文件 #pragma once // 前置声明 ClassA class ClassA; class ClassB { public: void func(ClassA* a); }; ``` 在上面的代码,我们使用了 `class ClassB;` 和 `class ClassA;` 来声明前置,而不是包含类的头文件。这样,编译器就能够知道这两个类的存在,从而解决了循环依赖的问题。 需要注意的是,如果使用了类的声明前置,那么只能在函数参数、函数返回值或者指针成员变量等地方使用这个类。如果需要使用该类的具体实现,还需要包含该类的头文件。例如,在 `ClassA.cpp` 文件实现 `ClassA` 的成员函数时,需要包含 `ClassB.h` 头文件: ```cpp // ClassA.cpp 文件 #include "ClassA.h" #include "ClassB.h" void ClassA::func(ClassB* b) { // 使用 ClassB 的具体实现 } ``` 总之,类的声明前置可以解决互相依赖的类之间的编译问题,提高代码的可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值