陸's的回答是對的,但我明白你在想什麼,所以讓我強化他的答案。你希望你的房子的名字可以在一個房間對象中訪問,但是一個房間不應該有房子的參考,因爲一個房間組成一個房子,並且不應該對房子有任何控制,對吧?讓supose:
class House;
class Room
{
public:
string getMyHouseName(); //return m_myHouse->getName();
void demolish(); //demolish the room
//other methods...
private:
House* m_myHouse;
};
class House
{
public:
string getName();
void demolish(); //demolish the house, calling demolish() of all rooms in "m_rooms"
//other methods...
private:
vector<Room*> m_rooms;
const string m_name;
};
正如你所看到的,你有機會獲得衆議院的名稱,這是很正常的,但你也從一個房間拆遷人的力量!好的,你知道你不應該在Room類中使用「m_myHouse-> demolish()」,但是你可以,而且這是一個常見的錯誤,它提供了比必要的更多的對象訪問。所以這個問題的解決方案是使用const方法和const對象。讓我告訴你:
class House;
class Room
{
public:
string getMyHouseName(); //return m_myHouse->getName();
void demolish(); //demolish the room
//other methods...
private:
const House* m_myHouse;
};
class House
{
public:
string getName() const;
void demolish(); //demolish the house, calling demolish() of all rooms in "m_rooms"
//other methods...
private:
vector<Room*> m_rooms;
const string m_name;
};
現在,「的getName()」的房子是const的方法,這意味着,該方法可以從房子的一個const實例調用,因爲它不會改變狀態的對象,你只是從House讀取信息。而「拆除()」並不是常量,因爲它可以改變房屋的狀態(拆除它的房間)。
所以,現在我們把House的一個const引用放在一個房間裏,一個「只讀」對象。現在,房間沒有權力改變房子了。你不能在房間裏調用m_myHouse-> demolish(),你沒有那個控制權,但House可以拆除任何房間。這就是衆議院「擁有」一個房間的方式。
我有一個名爲Packets的類,它有一個Send和Recv類組合,Send和Recv類都需要很多來自Packets類的數據成員。我可以繼承它們,但我沒有機會將它們引用爲「Packets.Send」或「Packets.Recv」 – ffenix
數據包是同時發送還是接收的? – JohnB
@ffenix'Send'和'Recv'聽起來就像你對一個數據包所做的事情。爲什麼「Pachets」課堂需要這樣的作文?也許你需要重新設計? – juanchopanza