记录一次循环引用的问题

简介: 记录一次循环引用的问题

1、说明:对象A对对象B进行引用,同时对象B也引用到了对象A,导致循环引用。

1.1、错误示例如下:

A.h

#pragma once
#include "B.h"
class A
{
public:
  B b;
};

B.h

#pragma once
class A;
class B
{
public:
  A a;
};
1.2、编译报错:

1.3、错误原因:

在A.h:2,处理语句#include “B.h”,进行头文件展开

在B.h:5进行的是在class B中声明一个A类型的成员变量,而此时class A还没有被声明

因此编译报错:‘A’ does not name a type

1.4、解决循环依赖的问题有两种方式:

1.使用前向声明(forward declaration)

2.设计层面避免循环引用

2、前项声明

2.1、前向声明的作用:

1.不需要include头文件,大量引入的头文件会导致编译变慢

2.可以解决两个类相互循环调用的情况

2.2、注意事项:

由于前向声明而没有定义的类是不完整的,所以class A只能用于定义指针、引用、或者用于函数形参的指针和引用,不能用来定义对象,或访问类的成员。

这是因为需要确定class B空间占用的大小,而类型A还没有定义不能确定大小,但A是指针类型大小已知,因此Class B中可以使用A定义成员变量。

2.3、针对前向声明的特点,修改如下:

1、将对象改成对象指针

2、B的文件中,使用A之前进行声明

示例如下:

A.h

#pragma once
#include "B.h"
class A
{
public:
  B* b;
};

B.h

#pragma once
class A;
class B
{
public:
  A* a;
};

3、设计层面避免循环引用

说明:采用C++的多态特性,提取抽象类。使用父类指针、子类对象的方式解决循环依赖,让具体依赖抽象的父类。

实现方式如下:

IA.h

class IA
{
}

A.h

#include "IA.h"
#include "B.h"
class A : public IA
{
  B* b;
}

B.h

#include "IA.h"
class B
{
public:
  B(IA* ia) { m_ia = ia; }
private:
  IA* m_ia;
}

main.cpp

IA* ia = new A();


相关文章
|
SQL XML 关系型数据库
Mybatis-Plus通过SQL注入器实现真正的批量插入
Mybatis-Plus通过SQL注入器实现真正的批量插入
7056 0
Mybatis-Plus通过SQL注入器实现真正的批量插入
|
5月前
|
存储 人工智能 物联网
QLoRA究竟如何从LoRA进化而来并成为AI工程师的必备技能?
本文AI产品专家三桥君深入解析了QLoRA技术在AI领域的关键作用。作为LoRA(低秩自适应)的升级版,QLoRA通过4位NormalFloat量化、双重量化和分页优化器三大核心技术,显著降低大模型微调的显存占用,同时保持性能。三桥君从技术背景、原理、应用场景(个人开发、企业定制、边缘设备)及未来潜力展开,指出QLoRA已成为AI工程师的必备技能,并预测其将继续推动AI技术发展。
352 0
|
9月前
|
前端开发
鸿蒙开发:Canvas绘制之画笔对象Pen
Pen对象主要适用于修改图形形状的轮廓信息,可以修改的有,颜色,线宽,是否抗锯齿,透明度,线帽样式等等属性,当然了如果你想实现一个填充效果,需要切换Brush对象。
231 9
鸿蒙开发:Canvas绘制之画笔对象Pen
|
网络协议 网络架构
IPv6基础知识
本文档详细介绍了IPv6协议的发展背景及其带来的主要变化,涵盖了IPv6数据报的基本首部和扩展首部结构,以及IPv6地址的表示方法和分类。由于IPv4地址资源有限且设计存在缺陷,IPv6应运而生,解决了这些问题并引入了许多新特性。文档还探讨了IPv6地址的不同类型,如单播、多播和任播地址,并讨论了IPv4向IPv6过渡的策略,包括双协议栈和隧道技术。
657 8
|
机器学习/深度学习 人工智能 自然语言处理
评测:AI 大模型助力客户对话分析
该评测报告详细介绍了Al大模型在客户对话分析中的应用,涵盖了实践原理、实施方法、部署体验、示例代码及业务适应性。报告指出,该方案利用NLP和机器学习技术,深度解析对话内容,精准识别用户意图,显著提升服务质量与客户体验。实施方法清晰明了,文档详尽,部署体验顺畅,提供了丰富的引导和支持。示例代码实用性强,但在依赖库安装和资源限制方面需注意调整。整体上,该方案能够满足基本对话分析需求,但在特定行业场景中还需进一步定制化开发。
|
数据采集 机器学习/深度学习 数据可视化
R实战| PCA、tSNE、UMAP三种降维方法在R中的实现
R实战| PCA、tSNE、UMAP三种降维方法在R中的实现
753 0
【C++11(三)】智能指针详解--RAII思想&循环引用问题
【C++11(三)】智能指针详解--RAII思想&循环引用问题
|
安全 Python
【Python】@property用法简述
【Python】@property用法简述
351 0
|
存储 安全 数据安全/隐私保护
Obsidian笔记软件无公网远程同步数据到群辉Webdav
Obsidian笔记软件无公网远程同步数据到群辉Webdav
622 1