C++中为实现构造函数两次声明同一struct的作用是什么?
问题解答
这是C++中为解决类型与函数的循环依赖,必须使用的**前向声明(Forward Declaration)**写法,并不是无意义的重复声明结构体。
你提到的第二种写法无法直接通过编译,核心原因是存在两个互相依赖的编译要求:
Sales_data的构造函数内部调用了read函数,因此在定义这个构造函数之前,编译器必须先看到read函数的声明,否则会报错「调用未声明的函数」。- 而
read函数的第二个参数是Sales_data&类型,要声明read函数,编译器必须先知道Sales_data是一个合法的结构体类型,否则会报错「未知类型名Sales_data」。
第一种写法里第一行的struct Sales_data;就是前向声明,它不需要给出结构体的内部成员定义,仅向编译器声明「存在名为Sales_data的结构体类型」,这个信息已经足够支撑编译器识别Sales_data&、Sales_data*这类引用/指针类型的参数。
整个代码的编译逻辑是完全通顺的:
- 前向声明
struct Sales_data,让编译器识别该类型 - 声明
read函数,此时编译器已经认识Sales_data类型,函数声明可以正常通过 - 完整定义
Sales_data结构体,此时编译器已经见过read的声明,构造函数中调用read的逻辑可以正常编译
补充说明:也有替代方案可以不用前向声明,比如先定义Sales_data结构体,只在内部声明接收istream的构造函数,等之后声明完read函数再在结构体外部实现构造函数,两种写法没有优劣之分,只是代码结构不同。
内容的提问来源于stack exchange,提问作者DeEterna
相关产品推荐
相关产品推荐

