C++类的交叉引用问题
注:类的交叉引用本身就是一种不好的设计,BUT……如果我们非要这么用……
1、错误的方法
main.cpp
#include <iostream>#include "class_a.h"
#include "class_b.h"int main()
{A aa;aa.InvokeB();B bb;bb.InvokeA();
}
class_a.h
#ifndef CLASS_A_H
#define CLASS_A_H#include "class_b.h"class A
{
public:void InvokeB(){B *b;b->Print();}void Print(){std::cout << "This is class A\n";}
};#endif
class_b.h
#ifndef CLASS_B_H
#define CLASS_B_H#include "class_a.h"class B
{
public:void InvokeA(){A *a;a->Print();}void Print(){std::cout << "This is class B\n";}
};#endif
此处我们用#ifndef...#endif保护机制,导致编译器(VS2012)认为在class_b.h中,A仍然是未声明的标识符。
如果去掉这个保护机制,又会引起“重定义”或者“包含文件太多,深度=1024”等问题。
必须考虑其他的实现方法。
2、一种正确的实现
main.cpp
#include <iostream>#include "class_a.h"
#include "class_b.h"int main()
{A aa;aa.b->Print();B bb;bb.a->Print();
}
class_a.h
#ifndef CLASS_A_H
#define CLASS_A_Hclass B;
class A
{
public:void Print(){std::cout << "This is class A\n";}B *b;
};#endif
class_b.h
#ifndef CLASS_B_H
#define CLASS_B_Hclass A;
class B
{
public:void Print(){std::cout << "This is class B\n";}A *a;
};#endif
输出:
在这种方法中使用了指针。
好处在于,程序可以在不知道类的具体实现是什么的情况下创建相关的指针。
前提条件是必须先声明类,并且指针在public域。此时不再有头文件交叉包含的困扰~
C++类的交叉引用问题相关推荐
- C++ 类的交叉引用
什么是交叉引用? 简单来说就是 A类中包含B类的对象,B类中包含A类的对象. class A{B b; };class B{A a; }; 这样写是会出问题的. 为什么产生交叉引用? 因为编译器如果先 ...
- Androguard 的交叉引用说明
交叉引用 crossreferences (XREFs) Androguard 的交叉引用包含了一下的四个东西: Classes Methods Fields Strings XREFs 工作在两个方 ...
- wps如何交叉引用多个文献_WPS中引用参考文献的设置
WPS 中引用参考文献的设置 1. 以尾注的方式插入第一个参考文献 将光标定位于 word 文档中将要插入参考文献的位置,按"插入 / 引用 / 脚注和尾注" .出 现一菜单,选择 ...
- mysql数据表交叉引用_数据定义语句
数据定义语句 MySQL 8.0支持原子数据定义语言(DDL)语句.此功能称为原子DDL.原子DDL语句将数据字典更新,存储引擎操作和与DDL操作相关联的二进制日志写入操作组合到单个原子事务中.即使事 ...
- IOS小知识点5之内存警告、循环引用、交叉引用
IOS的内存使用有以下几个等级,最常见的就是OSMemoryNotificationLevelWarning OSMemoryNotificationLevelUrgent typedef enum ...
- 交叉引用跳转不到后面_参考文献如何正确标注引用而不会变红?
最近看到很多人都说参考文献标注了以后,也做了引用,但是引用的地方查重居然标红了,但是没查重的居然是绿的,很费解.原因就是引用做的不对,引用格式都不对,原文又没改,那就是直接复制的句子肯定就标红了啊. ...
- Excel交叉引用及其应用实例
熟悉Excel的你,可能听说过相对引用.绝对引用和混合引用,那你听说过交叉引用吗?经常在各大Excel 论坛中转下,在无意中发现了这一个被称为交叉引用的东东,在现实中应 用虽然很少,但却很有意思,也许 ...
- Androguard交叉引用Crossreferences(XREFs)
Androguard交叉引用Crossreferences(XREFs) Crossreferences(XREFs)交叉引用,是由 androguard.core.analysis.analysis ...
- 每天一个IDA小技巧(六)交叉引用
在使用IDA进行逆向时,经常会碰到需要「定位某个变量被哪些函数访问」或者「某个函数是从什么地方被调用的」.这种跟踪变量或函数的功能在IDA中被称作交叉引用(XREF),同时IDA还提供了图形生成功能, ...
最新文章
- 大型网站的灵魂——性能优化
- 防火墙(14)——实现路由转发功能(2)
- pg和oracle比较,Oracle与PostgreSQL使用差异对比与总结
- Java面试进阶:Dubbo、Zookeeper面试题锦集
- 深度学习(十九)基于空间金字塔池化的卷积神经网络物体检测
- TCP/IP具体解释--TCP的分段和IP的分片
- js 实现ReplaceAll 的方法
- 彻底卸载anaconda
- java导出csv文件,使用Excel打开中文乱码
- 西电软工oop面向对象程序设计实验三上机报告
- WIN10无法启动(启动画面转圈卡死)的解决方法
- 关于svn(客户端)在安装完成过程中所遇到的一点问题
- SSL1659 栈练习括弧匹配检验
- 压缩多张图片,解压后发现图片文件损坏的问题解决
- Java——将一个正整数分解质因数
- 理解 LVM (Logical Volume Manager)
- css----BFC,IFC,GFC,FFC的区别
- 可编程直流稳压电源如何保养维护?
- 电子品牌内容营销人员应具备的14大软文写作技能
- VSCode插件之实时字数统计与选中词英汉互译
热门文章
- 如何绘制UML用例图
- 献给android原生应用层开发初学者技术架构选型和整合的方案思路(二)
- Python中的swap函数
- 零售行业如何利用数据支撑全业务体系,8大场景1个案例讲清楚
- mysql导入数据时 USING BTREE 错误解决办法
- [SWPUCTF 2021 新生赛]babyrce
- linux 远程挂载目录,linux开机自动挂载远程主机文件目录
- 计算机和建筑学薪资待遇区别,工科中薪资待遇最高、女生最多、毕业后竞争最激烈的前两名专业!...
- 数据分析中的专业术语
- CSS 重要属性与定位