【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 }
复制代码

 

 

参考资料

1. C++ 类声明 类前置声明范例

 

posted @   苏格拉底的落泪  阅读(552)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
点击右上角即可分享
微信分享提示