`
provista
  • 浏览: 120442 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C++类间相互引用

 
阅读更多
两个类相互包含引用的问题

不管是下文中提到的例子,还是任何情况,使得class A的头文件需要include class B的头文件,class B的也要引用A的头文件,这种状况下,貌似会出现有一个类未定义的问题从而无法通过编译。
解决办法是:
A或者B任选一个采用头文件(A.h)引用另一头文件(B.h)的方式不变,而另外一方的头文件(B)中则在定义该类之前写一句class A;然后在B的cpp文件中引用A的头文件。
================================================================
(下文为转载)
在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型
class A
{
    int i;
    B b;
}

class B
{
    int i;
    A* a;
}

请注意上面的定义内容,一般情况下是不能出现类A,类B相互引用都定义对象,即如下的样子:
class A
{
  int i;
  B  b;
}

class B
{
  int i;
  A   a;
}
在这种情况下,想想可以有a.b.a.b.a.b.a.b.a.b…………,很有点子子孙孙无穷尽之状,那么我的机器也无法承受。最主要的还是这种关系很难存在,也很难管理。这种定义方式类同程序中的死循环。所以,一般来说,两者的定义,至少有一方是使用指针,或者两者都使用指针,但是决不能两者都定义实体对象。

言归正传,那么,在定义时因为相互引用肯定会需要相互包含头文件,如果仅仅只是在各自的头文件中包含对方的头文件,是通不过编译的,如下:
//class A.h
#include "B.h"
class A
{
  int i;
  B   b;
}

//class B.h
#include "A.h"
class B
{
  int i;
  A *a;
}

如上的包含方式可能会造成编译器有错误提示:A.h文件中使用了示知类型B。
怎么办?
一般的做法是:两个类的头文件之中,选一个包含另一个类的头文件,但另一个头文件中只能采用class *;的申明形式,而在实现文件中(*.cpp)中包含头文件,如下:
//class A.h
#include "B.h"
class A
{
  int i;
  B   b;
}

//class B.h
class A;
class B
{
  int i;
  A *a;
}

//B.cpp
//在B.cpp中的文件包含处要有下面语句,否则不能调用成员a的任何内容
#include "A.h"
B::B()
{
……
}
分享到:
评论

相关推荐

    c++ 类的互相调用的方法

    c++ 类的互相调用的方法,是今天弄明白的,这里提供例子和说明给大家参考,从而告诉大家C++中类与类之间的关系,是不能烂用乱用的.希望能给大家启发.

    C++和C#相互调用COM组件

    网文 C++和C#相互调用COM组件举例等。

    浅析C和C++函数的相互引用

    作为一种欲与C兼容的语言,C++保留了一部分过程 式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支 持函数的重载...

    Halcon C++ 两种数据结构(Hobject和HTuple)

    该文档说明了在Halcon和C++之间如何相互引用数据的问题,即对内存的访问。

    C++ 标准程序库.pdf

    又相互借鉴与利用,如曾经的王者C++被后起之秀Java/C#等借法云梯直上,而今C++11标准则以其人之道还治其身,吸收了Java/C#里的诸多市场成熟养分,如①基于范围for循环、②类移动构造与委托能力扩充、③类初始化方式...

    新手学习C++入门资料

    输入和输出是通过C++类来实现的,cin和cout是这些类的实例,他们是在C++语言的外部实现。 在C++语言中,有了一种新的注释方法,就是‘//’,在该行//后的所有说明都被编译器认为是注释,这种注释不能换行。C++中...

    c++ 创建dll(动态库)、static lib(静态库),以及dll的相互调用 示例vs2022工程

    c++ 创建dll(动态库)、static lib(静态库),以及dll的相互调用 示例vs2022工程 sln项目文件在 c++_dll_staticLib\libtest\MathTestLib 目录下 以前有小错误,更新了错误(2023-05-28)

    C++、C#写的WebService(gsoap)相互调用

    用C#编写客户端时,只需要将WebService添加到引用,就能像调用本地方法一样去C# WebService调用。像这样的例子也比比皆是,在这就不多讲。 二、用C++实现WebService,一般会用到gsoap,具体方法见:...

    C++头文件包含问题的详细总结

    不同头文件中的类的嵌套在实际编程中,不同的类一般是放在不同的相互独立的头文件中的,这样两个类在相互引用时又会有不一样的问题。重复编译是问题出现的根本原因。为了保证头文 件仅被编译一次,在C++中常用的办法...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    9.3.4 string类对象和C字符串的相互转换 273 第10章 指针和动态数组 280 10.1 指针 280 10.1.1 指针变量 280 10.1.2 内存管理基础 287 10.1.3 动态变量和自动变量 289 10.1.4 指针的应用 292 10.2 动态数组 ...

    面向对象的程序设计语言——C++

    1.结构化程序设计方法与面向对象程序设计方法的各自特点、区别和相互联系。 2.面本向对象的程序设计方法中的有关概念,如类、对象、封装、继承、消息和多态性等。 3.C++程序的基本组成和框架结构。 4.掌握C++...

    C++MFC教程

    |------ 3.4 文档,视,框架之间相互作用 |------ 3.5 利用序列化进行文件读写 |------ 3.6 MFC中所提供的各种视类介绍 +-- 第四章 窗口控件 |------ 4.1 Button |------ 4.2 Static Box |------ 4.3 Edit Box |----...

    More Exceptional C++英文原版

    作为一个系列,这些书相互之间交叉引用;此外,它们也都引用了Bjarne Stroustrup的著作The C++ Programming Language。 在提高C++程序设计能力的过程中,日益重要的一点是将重要的知识同华而不实的东西分离开来,...

    -C++参考大全(第四版) (2010 年度畅销榜

    详细描述和演示了定义C++语言的关键字、语法、函数、类和特征。其中第一部分全面讨论了C++的C子集;第二部分详细介绍了C++本身的特性,如类和对象、构造函数、析构函数和模板等;第三部分描述了标准函数库;第四部分...

    C++网络爬虫项目

    编写单位: 达内IT培训集团 C++教学研发部 编写人员: 闵卫 定稿日期: 2015年11月20日 星期五WEBCRAWLER 网络爬虫实训项目 2 1. 项目概述 互联网产品形形色色,有产品导向的,有营销导向的,也有技术导向的,但是 ...

    摩托罗拉C++面试题

    13.C也可以通过精心封装某些函数功能实现重用,那C++的类有什么优点吗,难道仅仅是为实现重用。 并不仅仅是这样的。 OOD,OOP从根本上改变了程序设计模式和设计思想,具备重大和深远的意义。 类的三大最基本的特征:...

    C++轻量级通用插件框架源码

    采用智能指针类来管理接口的引用计数及生命期,可从一个接口动态转换为另一个接口(内部采用C++的RTTI机制动态转换),可以区分插件内部的接口引用和插件外部的接口引用。 d) 模块透明部署 一个模块只需要使用其他...

    C++的学习方法及书籍推荐

    然后记住C++的最大的一点设计哲学,也是其贯穿应用C++的一条本质,我引用《C++ PRIMER》中文版前言内的一句话表示--“C++的基础是各种设施,它们让用户能够通过定义新的数据类型来扩展语言本身,这些新类型可以与...

    高质量C++编程指南

    希望你能和我们多多交流、相互促进。半年前我曾经发现一颗好苗子,就把他挖到我们小组来。 (4)如果你在没有任何提示的情况下考了满分,希望你能收我做你的徒弟。 前 言 5 第1章 文件结构 10 1.1 版权和版本的声明...

Global site tag (gtag.js) - Google Analytics