当前位置: 首页 > news >正文

C++ 解决类相互引用导致的编译错误

class Mfun;
class fun
{
public:dosome(){g_mfun.start();}
};
fun g_fun;class Mfun
{
public:void start() {};
};
Mfun g_mfun;

分析:

  1. 当编译器看到 fun 类的定义时,Mfun 类还没有完全定义,只知道它的名字 g_mfun.start() 需要 Mfun.
  2. 类的完整定义,但此时只有前向声明. 全局变量的初始化顺序可能导致 g_fun 在 g_mfun 之前初始化 问题分析
  3. ​​循环依赖​​:fun 类中的 dosome() 方法使用了 g_mfun,而 g_mfun 是一个 Mfun 类型的全局变量
  4. ​​初始化顺序​​:全局变量 g_fun 和 g_mfun 的初始化顺序不确定,可能导致 g_fun 在 g_mfun 之前初始化
  5. 虽然 类前向声明,但是 在编译dosome(){ g_mfun.start(); }时,并没有得到类的具体信息,所有编译报错。

解决方案:

1:类成员函数 实现后置

class Mfun; // 前向声明class fun {
public:void dosome(); // 只声明,实现在Mfun定义之后
};
class Mfun {
public:void start() {};
};
// 现在可以完整定义fun的成员函数
void fun::dosome() {g_mfun.start();
}
// 全局变量定义
Mfun g_mfun;
fun g_fun;

这样编码器就能够解析到 类中的成员函数信息(不需要关注具体实现)。

2.使用静态成员函数或单例模式

class Mfun {
public:static Mfun& instance() {static Mfun instance;return instance;}void start() {};
};class fun {
public:void dosome() {Mfun::instance().start();}
};fun g_fun;

3.将实现与声明分离

头文件 fun.h:

class Mfun; // 前向声明
class fun {
public:void dosome();
};

源文件 fun.cpp:

#include "fun.h"
#include "Mfun.h"void fun::dosome() {g_mfun.start();
}// 全局变量
Mfun g_mfun;
fun g_fun;
http://www.dtcms.com/a/266072.html

相关文章:

  • 状态码301和302的区别
  • 智能设备远程管理:基于OpenAI风格API的自动化实践
  • 渗透靶机 Doctor 复盘
  • 粘包问题介绍
  • JS模块导出导入笔记 —— 默认导出 具名导出
  • 【嵌入式电机控制#8】编码器测速实战
  • C++讲解—类(2)
  • MCP+Cursor入门
  • AI 日报:阿里、字节等企业密集发布新技术,覆盖语音、图像与药物研发等领域
  • 前缀和与差分算法详解
  • 线程池相关介绍
  • SpringSecurity01
  • 【libm】 7 双精度正弦函数 (k_sin.rs)
  • 从混沌到澄明,AI如何重构我们的决策地图与未来图景
  • 把大象塞进冰箱总共分几步:讲讲dockerfile里conda的移植
  • IOC容器讲解以及Spring依赖注入最佳实践全解析
  • XILINX FPGA如何做时序分析和时序优化?
  • Linux之Socket编程Tcp
  • 【BurpSuite 2025最新版插件开发】基础篇7:数据的持久化存储
  • snail-job的oracle sql(oracle 11g)
  • 百度捂紧“钱袋子”
  • 冒泡排序及其优化方式
  • Javaweb - 10.1 Servlet
  • 两个手机都用同个wifi,IP地址会一样吗?如何更改ip地址
  • Redis实战:数据安全与性能保障
  • linux测试端口是否可被外部访问
  • ROS三维环境建模——基于OctoMap库
  • c++ 的标准库 --- std::
  • 【25-cv-07436】Keith律所代理《Four Season - Winter Breeze》画作维权!
  • NFSv4 ACL配置与参数