2013-05-03 64 views
3

我目前正在重新設計一個C++項目,並希望在有「有」(合成)關係的類需要訪問變量時可以如何處理變量,這些變量可以屬於父項,例如:處理組成關係中的變量

計算機對象有一個網卡對象。計算機對象具有所有者變量。例如

class Computer { 
     string get_owner(); // getter as an option? 
    private: 
     std::string owner = "baylesj"; 
     NetworkCard nic; 
} 

class NetworkCard { 
    public: 
     NetworkCard(Computer *parent); 
     send_packet(); 
     broadcast_owner(send_packet(m_parent->owner)); // this is kind of ugly 
    private: 
     Computer *m_parent; 
} 

比方說,我有一個需要所有者的網卡功能。當我在計算機中初始化時,是否更好地將所有者作爲網卡的成員變量傳遞,或者我應該在NetworkCard中有一個可以訪問Computer的成員變量,Getter/Setter或其他關係的父指針?我知道在孩子中有一個父指針是很常見的做法,但這是一個好主意/適當的OOP?

**計算機的事情就是例如,IRL它是別的東西,所以不要太籠罩它:)。

回答

3

我看到你認識到可以最大限度地減少不必要的耦合。爲此,您可以將NetworkCard類設計爲不知道父項的實現細節。這裏是傳遞名稱在網絡建設,廣播一個辦法:

class Computer { 
    public: 
     Computer(std::string const &owner) : m_Owner(owner), nic(owner) 
     { 
     } 

    private: 
     std::string m_Owner; 
     NetworkCard nic; 
}; 

class NetworkCard { 
    public: 
     NetworkCard(std::string const &owner) 
     { 
      broadcast_owner(owner); 
     } 

     send_packet(); 
     broadcast_owner(std::string const &owner); 

    private: 
}; 

如果您發現有太多這樣的變量傳遞的構造函數的參數(我喜歡不超過兩個或三個以上),那麼你可能會發現該構成是解決問題的錯誤工具。通常參數的數量很少,除非它實際上是一個「是-α」關係,在這種情況下,繼承可能是一個更好的工具。

+0

謝謝,這可以幫助我指出正確的方向。我特別感謝關於檢查構造函數參數數量的提示,以確定它是否應該是「is-a」。 – jaypb 2013-05-03 21:30:41

+1

我很高興這很有幫助。你做一些後會感覺很好。 – 2013-05-04 02:57:33