2013-10-29 37 views
0

我正在做一個小程序,只是爲了玩類。 我已經做了兩個類,a和b。錯誤:正向聲明,如何訪問指針

我想能夠訪問一個B,反之亦然。 這是我走到這一步:

#ifndef A_HH_ 
#define A_HH_ 

#include <string> 

class b; 

class a 
{ 
private: 
    string aString; 
    b* bClass; 
public: 
    a(){aString = "A";} 
    string getString(){return aString;} 
    string getBString(){return bClass->bString;} 
}; 


#endif /* A_HH_ */ 

和b:

#ifndef B_HH_ 
#define B_HH_ 

#include <string> 

class a; 

class b 
{ 
private: 
    string bString; 
    a* aClass; 
public: 
    b(){bString = "B";} 
    string getString(){return bString;} 
}; 


#endif /* B_HH_ */ 

我希望能夠訪問該指針不只是存儲。 我該怎麼做?

+4

您可以在使用前向聲明頭文件,然後將函數的實現放在一個cpp文件中,您可以在其中包含兩個頭文件。像你一樣以內聯方式進行內聯,要求提供完整的班級結構,因爲循環包含問題,您不能擁有這種班級結構。 –

+1

你是什麼意思?哪個指針?從設計的角度來看,通常不是兩個類具有這種雙向關係的好習慣 –

+0

請注意,循環和/或相互依賴通常被認爲是不好的。所以現在(感謝@RetiredNinja)你知道如何做到這一點,**不要**! :-) –

回答

1

的問題是,你使用bClass指針a類,對於需要b類的定義。在這種情況下,只需在a.hh中包含b.hh即可解決。這個簡單的解決方案將工作,因爲您只在類b中聲明a指針(但不訪問它)。前向聲明是不夠的,因爲它實際上並沒有告訴編譯器,只有類b存在。

哦,您需要將bClass->bStringa::getBString更改爲bClass->getString(),因爲b::bString是私人的。當然,創建一個b的實際實例並將其分配給bClass

0

總之,要訪問一個結構或類的成員,則需要滿足兩個條件:

  1. 的訪問元件(類,方法,...)必須獲得「權利」的引用成員
  2. 結構/類的定義必須可用。

要克服1.您可以將該成員設爲public,或者將訪問類或方法聲明爲friend或更好地使用getter方法。 爲了克服2.,你需要包含被引用類的頭部。

0

您可以使用模板:

爲:

#ifndef A_HH_ 
#define A_HH_ 

#include <string> 
#include "b.h" 


class a 
{ 
private: 
    string aString; 
    b* bClass; 
public: 
    a() 
    { 
     aString = "A"; 
     bClass = new b<a>; 
    } 
    string getString(){return aString;} 
    string getBString(){return bClass->getString();} 
}; 


#endif /* A_HH_ */ 

和B:

#ifndef B_HH_ 
#define B_HH_ 

#include <string> 

template <typename T> 
class b 
{ 
private: 
    string bString; 
    T* aClass; 
public: 
    b() 
    { 
     bString = "B"; 
     aClass = new T; 
    } 
    string getString(){return bString;} 
    string getAString(){return aClass->getString();} 
}; 


#endif /* B_HH_ */ 

這消除了循環依賴