error C2143: 语法错误 : 缺少“;”(在“*”的前面)

本文介绍了一种在C++编程中解决类交叉引用的方法:通过使用类的前置声明及指针引用,避免了因相互包含头文件导致的编译错误。此外还探讨了在设计上避免此类问题的思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

这里写图片描述
今天遇到一个bug,找了半天都没搞定,后来还是通过百度搜索到类似的帖子才解决的,其实很简单,只是以前没有见过罢了。

这里写图片描述

ResultDialog*resultDialog; 附近,怎么都不可能出错,怎么会缺少“;”呢?

原因在于,在HeartRateDetect类的定义中添加了防止重复包含的宏定义

#ifndef _HeartRateDetect_H
#define _HeartRateDetect_H

但是在ResultDialog类中,包含了HeartRateDetect的定义,在HeartRateDetect类中又包含了ResultDialog类的定义,结果造成重复包含了。

解决方案

解决类的交叉引用的方案是使用类的前置声明+指针引用,指针引用作为类成员,会告诉编译器我这里指向了一个ResultDialog类的对象,而不必关注该类的大小,也不必开辟对应内存,因此只需要在HeartRateDetect类前面声明该类,告诉编译器这个类存在即可。

在HeartRateDetect.h 文件中,把#include"ResultDialog.h" 删掉,然后在class HeartRateDetect 前面加一行 class ResultDialog; 的前置声明即可

或者,更麻烦一点,这两个类既然产生了交叉引用,那么在设计上,是存在一个双向依赖的,A类中包含B类的对象,B类中包含A类的对象,那么使用#include引用很可能会造成循环包含,如果存在设计上的可能性,应该把A和B合并成一个类。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值