两个类相互包含引用的问题
不管是下文中提到的例子,还是任何情况,使得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++编程中,类之间的相互调用是一个常见的设计模式,尤其在实现复杂系统或对象间的协作时。这种设计允许类A访问类B的成员,同时类B也可以访问类A的成员,形成一种循环依赖的关系。然而,这种关系需要谨慎处理,以...
在C++编程中,类的互相调用是一个常见的设计模式,用于实现复杂的系统结构和对象间的协作。这种机制使得代码更加模块化,提高了代码的复用性和可维护性。但正如描述中提到的,正确使用类的互相调用至关重要,避免...
### C++和C#相互调用COM组件 #### 概述 在软件开发过程中,有时候我们需要让不同语言编写的程序之间进行通信与交互。在.NET出现之前,COM(Component Object Model,组件对象模型)是一种广泛使用的跨语言通信技术...
标题所提及的"C++和C#相互调用"是指在C#应用程序中调用C++编写的代码,反之亦然。这种技术在需要利用C++的高性能计算能力或利用C#的.NET框架时特别有用。C++拥有强大的底层控制和性能,而C#则提供了丰富的库和面向...
然而,引用计数也有其局限性,比如循环引用的问题,即两个或更多对象相互引用,每个对象的引用计数都不为零,导致无法释放内存。在这种情况下,需要更复杂的垃圾回收机制,例如C++11引入的`std::weak_ptr`,它可以...
《C++类与对象的修改》 C++是一种支持面向对象程序设计(OOP)的高级编程语言。在C++中,类(Class)和对象(Object)是OOP的核心概念,它们允许开发者以更加符合现实世界的方式组织和管理代码。 8.1 面向对象程序...
这种方法是在引用超前引用类的地方一律用基类指针。而一般情况下,两个互相引用的类并不涉及其基类,因此不会造成超前引用。以开始的例子说:在CMyDialog类中用CView*代替CMyView*,在CMyView类中用CDialog*代替...
【C++、C#写的WebService相互调用】这个主题涉及到跨平台的Web服务通信,主要关注C++和C#这两种不同编程语言如何通过WebService进行数据交互。WebService是一种基于标准的、平台和语言无关的方式来交换数据,它利用...
如果两个或更多对象相互引用,它们的引用计数永远不会降为0,即使没有其他对象引用它们,内存也无法被回收。这就是为什么在C++中,智能指针如`std::shared_ptr`使用弱引用(`std::weak_ptr`)来打破这种循环引用,以...
在C++编程中,数据类型的相互转换是一种常见的操作,它涉及到不同数据类型的变量之间值的迁移。本篇文章将深入探讨C++中不同类型的转换方法,包括隐式转换和显式转换,以及它们在实际编程中的应用。 首先,我们讨论...
本篇将详细探讨如何在Unity3D环境中实现C#与C++DLL之间的函数相互调用。 首先,我们需要了解DLL(动态链接库)的概念。DLL是一种可执行文件,它包含可以由多个程序同时使用的函数和资源。在C#中,我们可以通过.NET ...
而C++调用C# DLL时需要设置为CLR支持,并使用托管指针来引用C#对象。对于COM组件,C#需要创建COM可见的类和接口,并设置相应的注册项,以便其他语言如C++能够通过COM机制进行调用。无论是哪种方式,正确配置和理解两...
在C++编程中,头文件相互包含确实是一个常见的复杂问题,尤其当涉及到类的嵌套和依赖时。这里,我们将详细讨论这个问题,并提供一些解决策略。 首先,让我们来看一下类嵌套的问题。在C++中,类可以被嵌套定义,就像...
这篇博客“JNI编程(二) —— 让C++和Java相互调用(2)”显然深入探讨了如何利用JNI实现Java与C++之间的互调用。在Java应用程序中,有时为了性能优化或者利用已有的C/C++库,我们需要借助JNI来实现这种跨语言的通信。 ...
作为一种欲与C兼容的语言,C++保留了一部分过程 式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支 持函数的重载...
在C++编程中,类是面向对象编程的基础,它封装了数据和操作这些数据的方法。类的定义和实现是两个不同的概念,它们之间的关联对于理解C++程序的编译和链接过程至关重要。以下是对类定义与实现关联的详细解释。 **类...
双向关联表示两个类的对象相互引用对方,可以通过对方访问其公共属性和方法。例如,老师和学生之间的关系,老师知道学生,学生也知道老师。在实际的C++代码中,双向关联通过在两个类中都声明对方类型的指针、引用或...