C++中两个类相互include的问题

在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型

例如:

Cup.h

#ifndef CUP_H
#define CUP_H

#include "Box.h"

class Cup
{
    public:
        ~Cup();
        Box b;
        Cup();
};

#endif // CUP_H

Cup.cpp

#include "Cup.h"
#include <iostream>

using namespace std;

Cup::Cup()
{
    cout << "Cup cons" << endl;
}

Cup::~Cup()
{
    cout << "Cup des" << endl;
}

Box.h

#ifndef BOX_H
#define BOX_H

#include "Cup.h"

class Box
{
    public:
        Box();
        ~Box();
        Cup cup;
};

#endif // BOX_H

Box.cpp

#include "Box.h"

#include <iostream>

using namespace std;

Box::Box()
{
    cout << "Box cons" << endl;
}

Box::~Box()
{
    cout << "Box des" << endl;
}

在这种情况下,想想可以有b.cup.b.cup.b.....…………,这种定义方式类同程序中的死循环。编译器肯定会报错的。

我的报错信息是

include\Cup.h|10|error: ‘Box‘ does not name a type|

所以,一般来说,两者的定义,至少有一方是使用指针,或者两者都使用指针,但是决不能两者都定义实体对象。

言归正传,那么,在定义时因为相互引用肯定会需要相互包含头文件,如果仅仅只是在各自的头文件中包含对方的头文件,是通不过编译的,如上面的情况所示

解决的办法,让其中一个(例如Cup)只声明对方(class Box;)并且使用指针(Box *b),并且不包含头文件Box.h,在实现文件(Cup.cpp)文件中再包含Box.h,修改后的代码如下:

Cup.h

#ifndef CUP_H
#define CUP_H

class Box;

class Cup
{
    public:
        void createBox();
        ~Cup();
        Box *b;
        Cup();
};

#endif // CUP_H

Cup.cpp

#include "Cup.h"
#include <iostream>

#include "Box.h"

using namespace std;

Cup::Cup(): b(NULL)
{
    cout << "Cup cons" << endl;
}

Cup::~Cup()
{
    if (b!=NULL) delete b;
    cout << "Cup des" << endl;
}

void Cup::createBox() {
    b = new Box();
}

注意为什么不在Cup::Cup()中直接b = new Box(),因为这是死循环,直接StackOverflow,所以使用了createBox()

最后再写一个main.cpp来测试,可以去尝试解释一下运行结果

#include "Box.h"
#include "Cup.h"

#include <iostream>

using namespace std;

int main() {
    Box b;
    cout << "something in the middle" << endl;
    Cup c;
    c.createBox();
}
时间: 2024-10-06 21:34:59

C++中两个类相互include的问题的相关文章

多态时最好将基类的析构函数设为virtual、 C++中两个类相互包含引用问题 (转载)

多态:http://blog.csdn.net/tmljs1988/article/details/8146521 C++中两个类相互包含引用问题:http://blog.csdn.net/leo115/article/details/7395077 http://blog.csdn.net/tmljs1988/article/details/6081132

c++中两个类相互包含引用的相关问题

在构造自己的类时,可能会遇到两个类相互引用的问题. 例如: class A { int i; B b; }; class B { int i; A a; }; 在这种情况下,这样就会出现一个死循环a.b.a.b.a.b....,一般来说,应避免这种情况. 如果确实需要的话,一般来说,至少有一方需要定义成指针. 例如: class A { int i; B b; }; class B { int i; A* a; }; 如果按照以上的方式,既然存在互相引用,就必须互相包含头文件,如果仅仅是在自己的

【转】 C++中两个类相互包含引用问题

原文:http://blog.csdn.net/leo115/article/details/7395077 在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类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

转载:C++中两个类中互相包含对方对象的指针问题

原文链接:http://www.cnblogs.com/hanxi/archive/2012/07/25/2608068.html 前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某一个类未定义...所以我就想啊想,这样也对,我的头文件都有#ifndef的,包含了一次就不能再包含了,以为就实现不了这样的功能,于是就改了设计方案: class A { public: A(B* pB):m_pB(pB) { } private: B* m_pB; }; class B { publ

C++两个类相互包含引用的问题

在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { B b; } class B { A* a; } 请注意上面的定义内容,一般情况下是不能出现类A,类B相互引用都定义对象,即如下的样子: class A { B b; } class B { A a; } 编译器在声明A的时候,由于B的声明在A的下面所以出现编译错误 那么,在定义时因为相互引用肯定会需要相互包含头文件,如果仅仅只是在各自的头文件中包含

两个类相互包含引用的问题--类前向声明

1.背景 编程中遇到如下错误:使用不完全类型**以及**前向声明. 查找相关资料后发现是类的前向声明(forward declaration)问题:在程序中声明一个类后,此类是一个不完全类型(incompete type),即已知此类是一个类型,但不知道包含哪些成员. 不完全类型只能以有限方式使用,不能定义该类型的对象.不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数. 2.为什么需要前向声明 在构造自己的类时,有可能会碰到两个类之间

C++中两个类互相引用的解决方法

一.问题描述 现在有两个类A和B需要定义,定义A的时候需要用到B,定义B的时候需要用到A. 二.分析 A和B的定义和调用都放在一个文件中肯定是不可以的,这样就会造成两个循环调用的死循环. 根本原因是:定义A的时候,A的里面有B,所以就需要去查看B的占空间大小,但是查看的时候又发现需要知道A的占空间大小,造成死循环. 解决方法1: (1)写两个头文件A.h和B.h分别用于声明类A和B: (2)写两个.cpp文件分别用于定义类A和B: (3)在A和B的头文件中分别导入对方的头文件. 解决方法2: (

c++中两个类互相引用的问题

最近在改一个C++程序的时候碰到一条警告信息,警告信息为:“ 删除指向不完整“Q2DTorusNode”类型的指针:没有调用析构函数                1> c:\users\lxw\desktop\dragonfly第二阶段实验\最终的实验版本\实验目录\dragonfly_modify\src\Q2DTorus.h(6) : 参见“Q2DTorusNode”的声明 ” 警告信息很是奇怪,其实出于强迫症的原因想要解决掉这个警告信息,而且从警告信息来看,程序也应该存在内存泄露的问题,

类相互引用问题

在C语言中,如果头文件不加任何保护的话,两个头文件相互包含会导致编译出错,如下面两个文件: a.h #include "b.h" b.h #include "a.h" 使用gcc编译的话,会报下面的错误: from main.c:2:b.h:1:15: error: #include nested too deeply #include "a.h" ^make: *** [all] Error 1 这是一个无限循环,如果加了保护性的代码,则不会出