【C++】类前置声明范例
正文
• 在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration)。下面的程序中,带注释的那行就是类B的前置说明。这是必须的,因为类A中用到了类B,而类B的声明出现在类A的后面。如果没有类B的前置说明,下面的程序将不同通过编译,编译器将会给出类似“缺少类型说明符”这样的出错提示。
代码一:
1 #include <iostream> 2 using namespace std; 3 4 class B; // 这是前置声明(Forward declaration) 5 class A { 6 private: 7 B* b; 8 public: 9 A(B* b): b(b) {} 10 }; 11 12 class B { 13 }; 14 15 int main() 16 { 17 B* b = new B(); 18 A* a = new A(b); 19 delete a; 20 delete b; 21 return 0; 22 }
上面程序可以顺利编译和运行(几乎没有做什么,也没有输出)。
代码二:
1 #include <iostream> 2 using namespace std; 3 4 class B; // 这是前置声明(Forward declaration) 5 class A { 6 private: 7 B* b; 8 public: 9 10 A(B* b): b(b) {} 11 void someMethod() 12 { 13 b->someMethod(); // (1) 14 } 15 }; 16 17 class B { 18 public: 19 void someMethod() 20 { 21 cout << "something happened..." << endl; 22 } 23 }; 24 25 int main() 26 { 27 B* b = new B(); 28 A* a = new A(b); 29 a->someMethod(); 30 delete a; 31 delete b; 32 return 0; 33 }
编译发现代码(1)处出错。出错提示往往包括(不同的编译器给出的提示会有所不同):
1. 使用了未定义的类型B;
2. “->somemethod”的左边必须指向类/结构/联合/泛型类型
原因:
1. (1)处使用了类型B的定义,因为调用了类B中的一个成员函数。前置声明class B;仅仅声明了有一个B这样的类型,而并没有给出相关的定义,类B的相关定义,是在类A后面出现的,因此出现了编译错误;
2. 代码一之所以能够通过编译,是因为其中仅仅用到B这个类型,并没有用到类B的定义。
解决办法:
1 #include <iostream> 2 using namespace std; 3 4 class B; // 这是前置声明(Forward declaration) 5 class A { 6 private: 7 B* b; 8 public: 9 A(B* b); 10 void someMethod(); 11 }; 12 13 class B { 14 public: 15 void someMethod(); 16 }; 17 18 A::A(B* b):b(b) 19 { 20 } 21 22 void A::someMethod() 23 { 24 b->someMethod(); 25 } 26 27 void B::someMethod() 28 { 29 cout << "something happened..." << endl; 30 } 31 32 int main() 33 { 34 B* b = new B(); 35 A* a = new A(b); 36 a->someMethod(); 37 elete a; 38 delete b; 39 return 0; 40 }
参考资料
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY