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

前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某一个类未定义。。。所以我就想啊想,这样也对,我的头文件都有#ifndef的,包含了一次就不能再包含了,以为就实现不了这样的功能,于是就改了设计方案:

复制代码
class A
{
public:
    A(B* pB):m_pB(pB)
    {
    }

private:
    B* m_pB;
};

class B
{
public:
    B() {}
private:
    int m_i;
};
复制代码

只在一个类中包含另一个类的指针(算是聚类吧,A不管理m_pB的死活),而在B需要A的属性时通过传递参数进去。这样有些麻烦,但是勉强达到了我的需求。

  今天,又遇到一个必须使用相互包含对象指针的问题,要不然通过参数传来传去麻烦的不得了。所以还是百度了下,结果终于找到了:(c++)两个类相互包含引用的问题里面说的和我需要的差不多,解决方法是一样的。

  文章里面说的很清楚了,我也在这里复述一遍吧,主要解决的就是文件包含的问题:在A的头文件(A.h)中包含B的头文件(B.h),在A的源文件(A.cpp)中包含(A.h),在B的头文件中使用A的声明(class A;)而不是包含A的头文件,然后在B的源文件(B.cpp)中包含A的头文件和B的头文件。代码如下:

复制代码
// A.h
#include "B.h"
class A
{
public:
    A(B* pB):m_pB(pB) {}
    void useB();
private:
    B* m_pB;
};

//A.cpp
#include "A.h"
void A::useB()
{
    //do something for m_pB
}


//B.h
class A;
class B
{
public:
    B(A* pA):m_pA(pA) {}
    void useA();
    
private:
    A* m_pA;
};

//B.h
#include "A.h"
#include "B.h"
void B::useA()
{
    //do something for m_pA
}
复制代码

这样的话B的头文件中不能有使用A的对象指针m_pA的代码,否则会出现“使用了未定义的A”错误。

  最后,问题算是解决了,但是我现在还是有点不明白的,这C++头文件的包含和类的声明等等都应该牵涉到编译器的编译顺序问题,忘大师为我讲解下这是为什么。

  谢谢观众的捧场!

posted on 2019-01-10 11:07  混元真人  阅读(656)  评论(0编辑  收藏  举报