注:类的交叉引用本身就是一种不好的设计,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++类的交叉引用问题相关推荐

  1. C++ 类的交叉引用

    什么是交叉引用? 简单来说就是 A类中包含B类的对象,B类中包含A类的对象. class A{B b; };class B{A a; }; 这样写是会出问题的. 为什么产生交叉引用? 因为编译器如果先 ...

  2. Androguard 的交叉引用说明

    交叉引用 crossreferences (XREFs) Androguard 的交叉引用包含了一下的四个东西: Classes Methods Fields Strings XREFs 工作在两个方 ...

  3. wps如何交叉引用多个文献_WPS中引用参考文献的设置

    WPS 中引用参考文献的设置 1. 以尾注的方式插入第一个参考文献 将光标定位于 word 文档中将要插入参考文献的位置,按"插入 / 引用 / 脚注和尾注" .出 现一菜单,选择 ...

  4. mysql数据表交叉引用_数据定义语句

    数据定义语句 MySQL 8.0支持原子数据定义语言(DDL)语句.此功能称为原子DDL.原子DDL语句将数据字典更新,存储引擎操作和与DDL操作相关联的二进制日志写入操作组合到单个原子事务中.即使事 ...

  5. IOS小知识点5之内存警告、循环引用、交叉引用

    IOS的内存使用有以下几个等级,最常见的就是OSMemoryNotificationLevelWarning  OSMemoryNotificationLevelUrgent typedef enum ...

  6. 交叉引用跳转不到后面_参考文献如何正确标注引用而不会变红?

    最近看到很多人都说参考文献标注了以后,也做了引用,但是引用的地方查重居然标红了,但是没查重的居然是绿的,很费解.原因就是引用做的不对,引用格式都不对,原文又没改,那就是直接复制的句子肯定就标红了啊. ...

  7. Excel交叉引用及其应用实例

    熟悉Excel的你,可能听说过相对引用.绝对引用和混合引用,那你听说过交叉引用吗?经常在各大Excel 论坛中转下,在无意中发现了这一个被称为交叉引用的东东,在现实中应 用虽然很少,但却很有意思,也许 ...

  8. Androguard交叉引用Crossreferences(XREFs)

    Androguard交叉引用Crossreferences(XREFs) Crossreferences(XREFs)交叉引用,是由 androguard.core.analysis.analysis ...

  9. 每天一个IDA小技巧(六)交叉引用

    在使用IDA进行逆向时,经常会碰到需要「定位某个变量被哪些函数访问」或者「某个函数是从什么地方被调用的」.这种跟踪变量或函数的功能在IDA中被称作交叉引用(XREF),同时IDA还提供了图形生成功能, ...

最新文章

  1. 大型网站的灵魂——性能优化
  2. 防火墙(14)——实现路由转发功能(2)
  3. pg和oracle比较,Oracle与PostgreSQL使用差异对比与总结
  4. Java面试进阶:Dubbo、Zookeeper面试题锦集
  5. 深度学习(十九)基于空间金字塔池化的卷积神经网络物体检测
  6. TCP/IP具体解释--TCP的分段和IP的分片
  7. js 实现ReplaceAll 的方法
  8. 彻底卸载anaconda
  9. java导出csv文件,使用Excel打开中文乱码
  10. 西电软工oop面向对象程序设计实验三上机报告
  11. WIN10无法启动(启动画面转圈卡死)的解决方法
  12. 关于svn(客户端)在安装完成过程中所遇到的一点问题
  13. SSL1659 栈练习括弧匹配检验
  14. 压缩多张图片,解压后发现图片文件损坏的问题解决
  15. Java——将一个正整数分解质因数
  16. 理解 LVM (Logical Volume Manager)
  17. css----BFC,IFC,GFC,FFC的区别
  18. 可编程直流稳压电源如何保养维护?
  19. 电子品牌内容营销人员应具备的14大软文写作技能
  20. VSCode插件之实时字数统计与选中词英汉互译

热门文章

  1. 如何绘制UML用例图
  2. 献给android原生应用层开发初学者技术架构选型和整合的方案思路(二)
  3. Python中的swap函数
  4. 零售行业如何利用数据支撑全业务体系,8大场景1个案例讲清楚
  5. mysql导入数据时 USING BTREE 错误解决办法
  6. [SWPUCTF 2021 新生赛]babyrce
  7. linux 远程挂载目录,linux开机自动挂载远程主机文件目录
  8. 计算机和建筑学薪资待遇区别,工科中薪资待遇最高、女生最多、毕业后竞争最激烈的前两名专业!...
  9. 数据分析中的专业术语
  10. CSS 重要属性与定位