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++頭文件的包含和類的聲明等等都應該牽涉到編譯器的編譯順序問題,忘大師為我講解下這是為什么。

  謝謝觀眾的捧場!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM