两个类相互引用的解决方法

2023-05-16

1 问题提出

最近在编写“斗地主”游戏,在程序中有一个“CDealer”类用来实现发牌等等功能,还有一个“CPoker”类,用来表示扑克牌。在CDealer类中包含了一个CPoker类指针的成员变量,而在CPoker类中也包含了一个CDealer类指针的成员变量,如下所示:

//CPoker类头文件

#pragma once

#include "Dealer.h"

class CPoker

{

public:

    CPoker(void);

    ~CPoker(void);

private:

    CDealer *m_pDealer;

};

//CDealer类的头文件

#pragma once

#include "Poker.h"

class CDealer

{

public:

    CDealer(void);

    ~CDealer(void);

private:

    CPoker *m_pPoker;

};

程序编译时,错误提示为

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

poker.h(10) :error C4430: 缺少类型说明符- 假定为int。注意: C++ 不支持默认int

2 问题分析

因为在程序中首先包含的是Dealer.h,所以Dealer.h头文件首先被编译。如图3-1所示。在CDealer类的头文件中,第1步执行了#pragma once之后就进入到第2步,即Poker.h头文件中。在Poker.h头文件中进行第3步,执行#pragma once,之后进入到第4步,也就是Dealer.h中,由于Dealer.h中包含#pragma once,并且此时已经被编译,所以第4步中的#include “Dealer.h”实际上没有执行,继续进行到Poker.h的第5步,定义CDealer类的指针,此时CDealer类实际上还没有定义,因此编译时回报错。

3 问题解决

3.1 类的前向声明

从2中分析可以看到,报错的主要原因是CDealer类没有定义。可以使用类的前向声明(forwarddeclaration)的方式解决这个问题。如

class CDealer;


图3-1 头文件执行流程

在CPoker类定义中映入了类类型CDealer。在类声明之后而定义之前,类CDealer是一个不完全类型(incompetetype),即已知CDealer是一个类,但不知道包含哪些成员,所以使用类的前向定义后,只能声明该类的指针,而不是该类的对象。

同理,在Dealer.h中加入CPoker类的前向声明。

classCPoker;

3.2 将包含头文件的代码放到执行文件

尽量将包含头文件的语句放到执行文件(.cpp文件)中而不是在头文件中(.h文件)。因此,接下来将#include“Poker.h”语句放到Dealer.cpp文件中,而将#include“Dealer.h”语句放到Poker.cpp文件中。

4 小结

对于两个类间相互引用引发的编译错误,可以使用类前向声明的方式解决。类前向声明是一个不完整类型,只能使用其指针。尽量将包含头文件的代码放在cpp执行文件中,而不是h头文件中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两个类相互引用的解决方法 的相关文章

  • Visual Studio Code 常用快捷键

    功能快捷键跳转到定义F12往回跳转Ctrl 43 Alt 43 往前跳转Ctrl 43 Shift 43 注释 取消注释Ctrl 43 搜索Ctrl 43 F替换Ctrl 43 H在文件中搜索Ctrl 43 Shift 43 F变量重命名F
  • LaTeX中保留字符 # $ % ^ & _ { } \ 的输入方法

    LaTeX保留字符 常见的LaTeX保留字符有 xff1a amp backslash 在 LaTeX 中输入它们的命令是 xff1a documentclass UTF8 article usepackage ctex begin doc
  • 蓝桥杯:长草 ← DFS

    题目来源 https www lanqiao cn problems 149 learning 问题描述 小明有一块空地 xff0c 他将这块空地划分为 n 行 m 列的小块 xff0c 每行和每列的长度都为 1 小明选了其中的一些小块空地
  • 利用数组模拟栈,实现逆序输出。

    利用STL stack实现逆序输出的代码 在算法竞赛中 xff0c 利用STL stack实现逆序输出 xff0c 特别好理解 STL stack 的官方帮助文档详见 xff1a https cplusplus com reference
  • 算法竞赛中,sort()函数的常见用法。

    知识点 虽然我们已经学习了诸如快速排序 桶排序 基数排序 插入排序 选择排序等众多的排序算法 xff0c 但在算法竞赛中 xff0c 如需要进行排序 xff0c 我们一般 不会去重复造轮子 xff0c 即去实现某种排序算法后再使用 xff0
  • Android 打印调用栈的方法

    1 Java层调用栈打印 xff1a xff08 1 xff09 打印本地调用堆栈 Log i TAG Log getStackTraceString new Throwable 打印本地调用堆栈 xff08 2 xff09 打印远程调用堆
  • 利用gnome美化Ubuntu18.04

    先上最终的效果图 xff1a 首先需要安装gnome软件 sudo apt install gnome tweak tool 安装好后在terminal中输入 gnome tweaks 进入优化软件 软件里自带有一些主题和图标等 xff0c
  • 软件项目管理0712:干系人管理

    软件项目管理0712 xff1a 干系人管理 xff08 软件项目管理中最复杂的内容 xff09 这个题目是个大课题 xff0c 只谈一些自己的经验 xff0c 并不完整 xff0c 有很多缺漏 xff0c 在以后的工作中慢慢的完善 项目
  • 【JVM学习笔记】JVM内存区域定义与内存结构

    目录 定义和说明JVM内存区域的定义内存区域说明堆说明非堆 方法区说明堆栈的区别HotSpot虚拟机 JVM线程独占内存程序计数器 xff1a Program Counter RegisterJava虚拟机栈 xff1a Java Virt
  • 【自媒体营销神器】一键自动下载短视频并分发至长视频平台脚本开源展示

    项目语言 xff1a Python 开发历时 xff1a 一个月 为什么要开源 xff1a Those whom God wishes to destroy he first makes mad 用到的库 xff1a 首先是项目展示环节 x
  • 搞懂bashrc

    1 bashrc是什么 shell 是给电脑发送指令的地方 xff08 命令行 xff09 xff0c bash 是 Bourne Again Shell 的缩写1 我们在 Ubuntu 打开的命令行界面一般都是 bash xff0c 每次
  • powershell 解压RAR文件(简易版)

    01 前言 为啥要写这个 xff0c 因为可能有些特殊的环境无法使用RAR的解压软件 xff0c 因而动手找了一个库然后写了这个脚本 xff0c 希望有帮助 02 正文 准备 xff1a 第三方的dll SharpCompress xff0
  • 改变 Gnome Terminal 的默认大小

    Ubuntu 中 xff0c Gnome Terminal 的默认大小是 80列 xff0a 24行 xff0c 这是文本模式下的标准尺寸 对于图形界面环境而言 xff0c 默认的大小就不太适合了 如果不满意 Gnome Terminal
  • 主祷文

    主 祷 文 我们在天上的父 xff0c 愿人都尊你的名为圣 愿你的国降临 愿你的旨意行在地上 xff0c 如同行在天上 我们日用的饮食 xff0c 今日赐给我们 免我们的债 xff0c 如同我们免了人的债 不叫我们遇见试探 xff0c 救我
  • 一个失败的程序员

    一个失败的程序员 第一次写博客 xff0c 看了别人的很久 xff0c 也想了很久 xff0c 觉得无论文笔有多不好 xff0c 分享的内容有多糟糕 xff0c 都应该有这个勇气迈出第一步 xff0c 记录生活 抒写回忆 xff0c 等到回
  • H5新增标签及Tab切换水平垂直居中

    1 结构标签 xff08 1 xff09 section xff1a 独立内容区块 xff0c 可以用h1 h6组成大纲 xff0c 表示文档结构 xff0c 也可以有章节 页眉 页脚或页眉的其他部分 xff1b xff08 2 xff09
  • android构建工具gradle基础知识

    1 gradle概述 gradle是一个开源的通用构建工具 xff0c 可以构建几乎任意类型的产物 针对不同的场景 xff0c gradle使用不同的插件和DSL申明配置来共同完成构建 gradle有如下几个特点 xff1a 高性能基于jv
  • Kali linux 2016.2(Rolling)安装之后的常用配置

    转发 xff1a https www cnblogs com zlslch p 6047913 html 前言 使用默认的Kali Linux设置来学习是可以的 xff0c 但是我们通常要修改系统的一些基本设置 xff0c 来最大化使用Ka
  • JAVA版本:使用二分法查找数组中的数据

    使用二分法查找数组中的数据 xff1a 分析 xff1a 二分法查找适用于数据量较大时 xff0c 但是数据需要先排好顺序 主要思想是 xff1a xff08 设查找的数组区间为array low high xff09 xff08 1 xf

随机推荐

  • BlaBlaCar是如何解决四大挑战的?

    BlaBlaCar 是世界领先的长途拼车服务 xff0c 将汽车司机与乘客联系起来 BlaBlaCar 在 22 个国家 地区拥有 6000 万会员 xff0c 每季度有超过 1800 万旅客 xff0c 正在创建一个全新的 以人为本的旅行
  • K8S案例01

    一个简单的例子 Java Web应用 xff1a 是一个运行在 tomcat里的 Web App 如图1 1所示 xff0c JSP页面通过JDBC直接访问 MYSQL数据库并展示数据 为了演示和简化的目的 xff0c 只要程序正确连接到了
  • 【Ubuntu】修改ubuntu和windows双系统启动顺序

    目录 一 问题描述二 背景知识1 GRUB是什么2 GRUB配置文件3 96 etc default grub 96 主配置文件 二 问题分析三 解决方案1 修改grub主配置文件2 更新grub配置文件 一 问题描述 Ubuntu 43
  • OpenShift简介

    文章目录 OpenShift简介1 OpenShift是什么 xff1f OpenShift与K8S的区别1 应用部署2 应用管理3 节点配置4 安全性 2 为什么要用OpenShift xff1f 3 OpenShift的版本4 Open
  • Java 连接MariaDB

    Java应用程序连接MariaDB数据库 在本文中我们将了解到什么是JDBC驱动程序以及如何打开和安全地关闭MariaDB数据库连接 什么是 JDBC 驱动程序 xff1f JDBC 是一种 API规范 xff1a 一组定义该技术可以做什么
  • 使用 JDBC 执行 SQL 语句

    使用 JDBC 执行 SQL 语句 在上一篇文章中我们了解到什么是JDBC驱动程序以及如何打开和安全地关闭MariaDB数据库连接 接下来我们在上一篇文章的基础上学习如何使用 JDBC 对 SQL 数据库执行SELECT INSERT UP
  • 创建Redis企业版数据库的步骤

    一 Redis企业版数据库的功能 Redis Enterprise Software 允许您创建数据库并将它们分布在节点集群中 这些数据库可以使用 Redis Enterprise 功能 xff0c 例如 xff1a redis on fl
  • 关于Redis数据库,我问了ChatGPT几个问题

    最近互联网刮起了一阵ChatGPT风 xff0c 从程序猿 产品经理 运营再到大学生 xff0c 都在跟ChatGPT对话 xff01 例如 xff1a 请帮我检查这段代码的BUG 请帮我设计一款功能像虹科VUZIX一样的智能AR眼镜 虹科
  • 虹科案例 | 石油天然气行业CFD高性能计算解决方案

    公司简介 DNV GL是全球领先的能源 石油和海事行业风险管理及资产绩效提升的软件供应商 xff0c 主要为客户提供全面的风险管理和各类评估认证服务 xff0c 认证涉及信息通信技术 汽车及航空天 食品与饮料 医疗等方面 DNV GL以让世
  • 虹科干货| 虹科Redis企业版数据库:告别游戏卡顿,让快乐加速!

    卡顿一分钟 xff0c 玩家两行泪 游戏已成为年轻人最主要的消遣娱乐方式之一 xff0c 游戏卡顿给玩家带来糟糕游戏体验背后的原因是什么 xff1f 数据存储与查询速度不够快 xff01 游戏开发领域 xff0c 不仅拥有海量的数据 xff
  • 虹科干货 | 打破传统!金融界黑科技—虹科Redis企业版数据库

    金融行业数字化转型浪潮来袭 xff0c 客户需求也正加速向在线金融服务转移 金融机构想要实现现代化改造技术堆栈 xff0c 为客户提供实时交互 欺诈检测等一系列个性化创新服务 xff0c 就必须重视遗留系统和传统数据库架构 老年病 问题 x
  • 虹科干货 | 零售业数智升级不掉队,get数据,get未来!

    电商崛起 xff0c 传统零售行业危机四伏 xff0c 全渠道盈利与可持续化成为难点 xff0c 库存管理这块难啃的 硬骨头 也同样让零售商倍感压力 背腹受敌的零售商 xff0c 如何才能在数字化转型道路上避免利润缩水 xff0c 与供应商
  • 什么是网络数据包?

    流经网络的一切都可以被归类为数据包中所包含数据的一部分 一个网络数据包或IP包可以被称为一个数据单元 xff08 约1KBS至1 5KBS xff09 xff0c 在互联网或分组交换网络内从原点流向目标地址 xff08 从发送方到接收方 x
  • md5.pro.js前端MD5加密插件

    下载地址 例如我们对abc进行md5加密 xff0c 则只需要调用hex md5 34 md5 34 xff0c 方法则会返回加密后的字符串900150983cd24fb0d6963f7d28e17f72 dd
  • 02.构建项目流程梳理及总结

    02 构建项目流程梳理及总结
  • windows 下gtk字体问题

    windows下运行gtk程序 xff0c 出现如下问题 xff1a PangoWarning couldn 39 t load font 34 微软雅黑 Not Rotated 9 34 falling back to 34 Sans N
  • Ubuntu,源码安装Node.js

    Ubuntu xff0c 源码安装Node js Ubuntu Linux下安装Node js xff0c 其他linux系统步骤类似 Github获取源码 sudo git clone https github com nodejs no
  • utf-8转换到utf-16的转换过程你懂吗?

    人生自是有情痴 xff0c 此恨不关风与月 唐代元稹 离思 从UTF 8编码的文件中读取文本并将其存储到Java的String对象中 xff0c 涉及到从字节序列到Unicode码点 xff0c 再到UTF 16编码的转换 以下是详细的步骤
  • TP5的select,find和get查询方法的使用

    select查询出的是多条数据 xff0c 需要在模版volist循环打印出来 find和get获取单条数据 xff0c 可直接在模版打印 xff1b user 61 User get span class hljs number styl
  • 两个类相互引用的解决方法

    1 问题提出 最近在编写 斗地主 游戏 xff0c 在程序中有一个 CDealer 类用来实现发牌等等功能 xff0c 还有一个 CPoker 类 xff0c 用来表示扑克牌 在CDealer类中包含了一个CPoker类指针的成员变量 xf