【C++】错误C2027:使用了未定义类型错误原因 两个类之间怎么相互使用成员 向前声明概念_列队猫的博客-CSDN博客
摘自上面的博主
前向声明:
可以声明一个类而不定义它,这个声明被称为前向声明(forward declaration)。
在声明之后,定义之前,类是一个不完全类型(incompete type),即已知向前声明过的类是一个类型,但不知道包含哪些成员。
不完全类型只能以有限方式使用,不能定义该类型的对象,不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。
单独编译
可以通过编译的源文件就是一个编译单元,一个程序,可以由一个编译单元组成,也可以有多个编译单元组成
如:我们可以将所有东西都放在一个.cpp文件内,然后编译器就将这个.cpp编译成.obj,这就是一个编译单元
c++允许程序员将组件函数放在独立的文件中,可以单独编译这些文件,然后将它们链接成可执行的程序。
一个函数不能放到两个编译单元里面,但两个以上就可以分别放在一个单元,也就是cpp里面
一个.cpp对应一个.obj,然后将所有的obj链接起来(通过一个叫链接器的程序),组成一个.exe,也就是程序了。
如果一个.cpp要用到另一个.cpp定义的函数只需在这个.cpp文件中写上他的函数声明(C++在同一个项目下的不同文件都位于全局作用域下,在其他文件中也可以引用)
两个类之间相互引用成员
在构造自己的类时,有可能会碰到两个类之间的相互引用问题
例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型
1、若是只是在两个类中相互使用了另一个类作为方法参数或其他只是定义该类型的指针及引用行为,使用向前声明即可解决
不允许引用未定义类型:
使用前向声明解决:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d3e482a8a274c209e1636493ece9c31a.png)
2、使用向前声明之后,在类定义之前,类是一个不完全类型(incompete type),即已知向前声明过的类是一个类型,但不知道包含哪些成员,所以在使用向前声明后,类定义前,只能定义指向该类型的指针及引用而不能使用该类成员
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/78e25e4c5f7b4c96ced573f1c28c7fa2.png)
通过单独编译和向前声明方法实现两个类之间相互引用成员
向前声明的方法无法使用类的成员,那么只能使编译器知道这是自定义的类类型了
使用预处理指令include,将单独编译的文件引入到预处理命令include的地方
C++在同一个项目下的不同文件都位于全局作用域下,在其他文件中也可以引用,如果一个.cpp要用到另一个.cpp定义的函数只需在这个.cpp文件中写上他的函数声明
通过将不同的类分隔成不同的类文件,不同的类将类声明和类定义分隔开,在需要使用其他类时引入目标类的头文件(引入声明)即可使用目标类
头文件:
源文件:
综上,安全的写法需要如下步骤
- 相互include对方的头文件
- 相互前向声明对方的类
- 声明和实现都分开写