簡體   English   中英

合成訪問

[英]Composition access

我有以下課程:

  • 稱為房屋的類(具有有關房屋結構的數據)
  • 稱為房間的類,它是房屋的組成部分。

所以問題來了,例如當我想在房間中顯示房屋的名稱時,為了做到這一點,我需要從Room類中訪問房屋名稱,該組合的成分為“有”。

解決方法是通過構造函數將房屋名稱傳遞給room類,但這是多余的,因為我已經在House類中包含了數據。

另一個解決方案是繼承不屬於“ House is A Room”的“房間中的房子”,並且我將松散使用Sugar語法以使:

House.Room

因此,問題是:是否存在針對此類問題的標准解決方法或重新設計模式?

這也是一個例子:

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

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

陸謙的回答是正確的,但我明白您在想什么,所以讓我加強他的回答。 您想在“房間”對象中訪問房屋的名稱,但“房間”不應具有房屋參考,因為“房間”構成房屋,並且不應對房屋進行任何控制,對嗎? 讓我們擺姿勢:

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;
};

現在,House的“ getName()”是const方法,這意味着可以從House的const實例調用此方法,因為它不會更改對象的狀態,您只需從House讀取信息即可。 而且“ demolish()”不是const,因為它可以更改房屋的狀態(拆除房間)。

因此,現在我們將“房屋”的const引用放在一個“只讀”對象的房間中。 現在,Room無法再更改房屋。 您無法在Room中調用m_myHouse-> demolish(),但沒有該控件,但是House可以拆除任何房間。 這就是眾議院“擁有”房間的方式。

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;
};

盡管您不太可能真的需要這個。 您到底想完成什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM