【C++】错误C2027:使用了未定义类型错误原因 两个类之间怎么相互使用成员 向前声明概念

错误C2027:使用了未定义类型

当在同一个源文件中定义了两个类,而两个类又相互之间进行引用(如方法中定义形参为另一个类的指针,方法体中通过指针引用成员)时就会报错:C2027:使用了未定义类型

该错误可以通过向前声明和单独编译方法解决,下面先介绍一下概念,再给出解决方法

向前声明

前向声明:
可以声明一个类而不定义它,这个声明被称为前向声明(forward declaration)。
在声明之后,定义之前,类是一个不完全类型(incompete type),即已知向前声明过的类是一个类型,但不知道包含哪些成员。
不完全类型只能以有限方式使用,不能定义该类型的对象,不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。

单独编译

可以通过编译的源文件就是一个编译单元,一个程序,可以由一个编译单元组成,也可以有多个编译单元组成
如:我们可以将所有东西都放在一个.cpp文件内,然后编译器就将这个.cpp编译成.obj,这就是一个编译单元
c++允许程序员将组件函数放在独立的文件中,可以单独编译这些文件,然后将它们链接成可执行的程序。
一个函数不能放到两个编译单元里面,但两个以上就可以分别放在一个单元,也就是cpp里面

一个.cpp对应一个.obj,然后将所有的obj链接起来(通过一个叫链接器的程序),组成一个.exe,也就是程序了。

如果一个.cpp要用到另一个.cpp定义的函数只需在这个.cpp文件中写上他的函数声明(C++在同一个项目下的不同文件都位于全局作用域下,在其他文件中也可以引用)

两个类之间相互引用成员

在构造自己的类时,有可能会碰到两个类之间的相互引用问题
例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型
  1. 若是只是在两个类中相互使用了另一个类作为方法参数或其他只是定义该类型的指针及引用行为,使用向前声明即可解决

    不允许引用未定义类型:
    在这里插入图片描述
    使用向前声明解决:
    在这里插入图片描述

  2. 使用向前声明之后,在类定义之前,类是一个不完全类型(incompete type),即已知向前声明过的类是一个类型,但不知道包含哪些成员,所以在使用向前声明后,类定义前,只能定义指向该类型的指针及引用而不能使用该类成员

    在类定义之前不能使用类成员
    在这里插入图片描述

通过单独编译和向前声明方法实现两个类之间相互引用成员

向前声明的方法无法使用类的成员,那么只能使编译器知道这是自定义的类类型了

使用预处理指令include,将单独编译的文件引入到预处理命令include的地方

#include 命令是预处理命令的一种,预处理命令可以将别的源代码内容插入到所指定的位置;

C++在同一个项目下的不同文件都位于全局作用域下,在其他文件中也可以引用,如果一个.cpp要用到另一个.cpp定义的函数只需在这个.cpp文件中写上他的函数声明

通过将不同的类分隔成不同的类文件,不同的类将类声明和类定义分隔开,在需要使用其他类时引入目标类的头文件(引入声明)即可使用目标类

头文件声明

#pragma once
#include <iostream>
#include"SeparateCompilationClass1.h"//编译完成后,预处理器将文件的内容添加到程序中,该头文件就拥有了B类的完整声明
using namespace std;
class B;//使用向前声明,在编译器表示此为一个类类型,使头文件声明通过编译
class A {
public:
	void fun(B* b);//由于是声明,所以并不使用类成员,向前声明可以通过编译
};

在这里插入图片描述

源文件实现

#include"SeparateCompilationClass2.h"//A类的头文件,在其中引用了B的头文件,拥有B的完成声明,所以在本文件中可以使用B类成员
void A::fun(B* b) {//通过作用域运算符为A类添加成员定义
 cout << "A中的方法" << endl;
 cout << "使用B中成员:" << endl;
 b->fun();//通过单独编译可以使用B中成员
	}

在这里插入图片描述

  • 47
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

列队猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值