2012-09-17 52 views
0

我有以下類:組成訪問

  • 類稱爲屋(其具有關於房屋結構數據)
  • 類稱爲間是房屋的組合物。

所以問題來了,當我想要例如在房間裏顯示房子的名稱,所以爲了做到這一點,我需要從房間類訪問房屋名稱組成「有」不會讓我。

解決方法是通過構造函數將房屋名稱傳遞給房間類,但這是冗餘,因爲我已經有House類中的數據。

另一種解決方案將繼承家中房間這是不完全「房子是一個房間」,也是我將失去糖語法進行:

House.Room 

所以,問題是:是否有這種問題的標準解決方案還是重新設計模式?

而且這裏有一個例子:

class Room { 
public: 
    MyHouseName();  //Needs access to const char* name from House 
}; 

class House { 
    const char* name 
    vector<Room> rooms; 
}; 

回答

1

陸'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可以拆除任何房間。這就是衆議院「擁有」一個房間的方式。

0

Room保持一個指向擁有它的House

class House; 
class Room { 
public: 
    MyHouseName();  //Needs access to const char* name from House 
    House* house; 
}; 

class House { 
    const char* name 
    vector<Room> rooms; 
}; 

雖然它不太可能,你真的需要這個。你究竟想要完成什麼?

+0

我有一個名爲Packets的類,它有一個Send和Recv類組合,Send和Recv類都需要很多來自Packets類的數據成員。我可以繼承它們,但我沒有機會將它們引用爲「Packets.Send」或「Packets.Recv」 – ffenix

+0

數據包是同時發送還是接收的? – JohnB

+0

@ffenix'Send'和'Recv'聽起來就像你對一個數據包所做的事情。爲什麼「Pachets」課堂需要這樣的作文?也許你需要重新設計? – juanchopanza