`
provista
  • 浏览: 121837 次
  • 性别: 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++编程中,类之间的相互调用是一个常见的设计模式,尤其在实现复杂系统或对象间的协作时。这种设计允许类A访问类B的成员,同时类B也可以访问类A的成员,形成一种循环依赖的关系。然而,这种关系需要谨慎处理,以...

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

    在C++编程中,类的互相调用是一个常见的设计模式,用于实现复杂的系统结构和对象间的协作。这种机制使得代码更加模块化,提高了代码的复用性和可维护性。但正如描述中提到的,正确使用类的互相调用至关重要,避免...

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

    ### C++和C#相互调用COM组件 #### 概述 在软件开发过程中,有时候我们需要让不同语言编写的程序之间进行通信与交互。在.NET出现之前,COM(Component Object Model,组件对象模型)是一种广泛使用的跨语言通信技术...

    C++和C#相互调用

    标题所提及的"C++和C#相互调用"是指在C#应用程序中调用C++编写的代码,反之亦然。这种技术在需要利用C++的高性能计算能力或利用C#的.NET框架时特别有用。C++拥有强大的底层控制和性能,而C#则提供了丰富的库和面向...

    引用计数的c++源码实现

    然而,引用计数也有其局限性,比如循环引用的问题,即两个或更多对象相互引用,每个对象的引用计数都不为零,导致无法释放内存。在这种情况下,需要更复杂的垃圾回收机制,例如C++11引入的`std::weak_ptr`,它可以...

    C++类与对象的修改

    《C++类与对象的修改》 C++是一种支持面向对象程序设计(OOP)的高级编程语言。在C++中,类(Class)和对象(Object)是OOP的核心概念,它们允许开发者以更加符合现实世界的方式组织和管理代码。 8.1 面向对象程序...

    C++中头文件相互包含的几点问题

    这种方法是在引用超前引用类的地方一律用基类指针。而一般情况下,两个互相引用的类并不涉及其基类,因此不会造成超前引用。以开始的例子说:在CMyDialog类中用CView*代替CMyView*,在CMyView类中用CDialog*代替...

    C++、C#写的WebService相互调用

    【C++、C#写的WebService相互调用】这个主题涉及到跨平台的Web服务通信,主要关注C++和C#这两种不同编程语言如何通过WebService进行数据交互。WebService是一种基于标准的、平台和语言无关的方式来交换数据,它利用...

    C++引用计数设计与分析(解决垃圾回收问题).docx

    如果两个或更多对象相互引用,它们的引用计数永远不会降为0,即使没有其他对象引用它们,内存也无法被回收。这就是为什么在C++中,智能指针如`std::shared_ptr`使用弱引用(`std::weak_ptr`)来打破这种循环引用,以...

    C++类各种类型转换_数据类型的相互转换_

    在C++编程中,数据类型的相互转换是一种常见的操作,它涉及到不同数据类型的变量之间值的迁移。本篇文章将深入探讨C++中不同类型的转换方法,包括隐式转换和显式转换,以及它们在实际编程中的应用。 首先,我们讨论...

    C#和c++dll函数相互调用

    本篇将详细探讨如何在Unity3D环境中实现C#与C++DLL之间的函数相互调用。 首先,我们需要了解DLL(动态链接库)的概念。DLL是一种可执行文件,它包含可以由多个程序同时使用的函数和资源。在C#中,我们可以通过.NET ...

    C++和C#相互调用dll

    而C++调用C# DLL时需要设置为CLR支持,并使用托管指针来引用C#对象。对于COM组件,C#需要创建COM可见的类和接口,并设置相应的注册项,以便其他语言如C++能够通过COM机制进行调用。无论是哪种方式,正确配置和理解两...

    C++中头文件相互包含的几点问题.docx

    在C++编程中,头文件相互包含确实是一个常见的复杂问题,尤其当涉及到类的嵌套和依赖时。这里,我们将详细讨论这个问题,并提供一些解决策略。 首先,让我们来看一下类嵌套的问题。在C++中,类可以被嵌套定义,就像...

    JNI编程(二) —— 让C++和Java相互调用(2)

    这篇博客“JNI编程(二) —— 让C++和Java相互调用(2)”显然深入探讨了如何利用JNI实现Java与C++之间的互调用。在Java应用程序中,有时为了性能优化或者利用已有的C/C++库,我们需要借助JNI来实现这种跨语言的通信。 ...

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

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

    类定义与实现如何相互关联

    在C++编程中,类是面向对象编程的基础,它封装了数据和操作这些数据的方法。类的定义和实现是两个不同的概念,它们之间的关联对于理解C++程序的编译和链接过程至关重要。以下是对类定义与实现关联的详细解释。 **类...

    C/C++ 类关系

    双向关联表示两个类的对象相互引用对方,可以通过对方访问其公共属性和方法。例如,老师和学生之间的关系,老师知道学生,学生也知道老师。在实际的C++代码中,双向关联通过在两个类中都声明对方类型的指针、引用或...

Global site tag (gtag.js) - Google Analytics