2015-09-13 47 views
-1

C++提供了兩個類似的規定來執行相同的任務。雖然對象組合似乎更方便,因爲聲明的類也可以用於其他類。對象組合vs C++中的嵌套類我應該在什麼時候使用?

例如, 「地址」類可以包含一些屬性和功能,然後可以用作「學生」類的屬性。 或者,'Address'類可以在'Student'類(嵌套)中聲明。

所以我的疑問是,這些方法中哪一個應該使用,什麼時候使用? 也被認爲比另一個更好的方法?

+0

可能重複(http://stackoverflow.com/questions/49002/偏好合成 - 繼承) – Spacemoose

+1

@Spacemoose我看不到任何遺傳。 –

+0

我想他的意思是詢問'Address'是否應該在'Student'內聲明。 –

回答

0

拆分Student類爲Address類沒有太大意義,除非有其他的「東西」需要一個Address太(見下文) - 一個更合理的做法是有一個Person類,然後派生StudentPerson - 以及Teacher,Dean或任何其他類可能需要描述一所學校。這裏的關鍵是要看「什麼是共同的,什麼是分離的」。

但有些情況下AddressAddressable類是有用的。如果我們想跟蹤家庭,並且想要爲兩個大人,兩個孩子,一個狗,一個房子和一輛汽車以某種形式的數據庫(例如保險公司)只有一個Address的項目,那麼有一個單獨的Address可能確實有道理。如果家中的兒子(或女兒)然後搬去上大學,他將得到一個新的單獨地址(以及一個法案,以涵蓋在大學裏與父母生活在一起的額外風險)。

或者如果我們必須跟蹤非Person的東西 - 比如說你不只有人,而且還有需要有Address的建築物和設備。然後,爲「非人」和「人」設置一套通用的功能會更有意義。

這實際上取決於你的目標是什麼,你真的需要考慮使用數據。沒有實際的固定和堅定的答案。分裂太多與合併太多一樣糟糕。

0

如果我正確理解你的問題,它是關於定義子對象的類(這裏是Address)是否應該在包含類中包含的類(此處爲Student)聲明在同一級別。

主要區別在於從子對象訪問封閉類的私有成員或受保護成員。作爲其封閉類的成員的嵌套類將有權訪問所有私有成員(參考:n4296 C++ 11草案中的嵌套類[class.access.nest])。

這裏是一個例子,其中其包圍類的私有成員嵌套類訪問:[?體型組合物過度繼承]的

class Person { 
public: 
    class Address { 
    public: 
     std::string street; 
     std::string town; 
     std::string state; 

     Address(std::string street, std::string town, std::string state) 
      :street(street), town(town), state(state) {} 
     void print(std::ostream&, const Person& p) const; 
    }; 

    Person(std::string firstname, std::string lastname, Address address); 
private: 
    std::string firstname; // private member 
    std::string lastname; 
    Address address; 
    // other members ... 
}; 

Person::Person(std::string firstname, std::string lastname, Address address) 
    :firstname(firstname), lastname(lastname), address(address) {}; 

void Person::Address::print(std::ostream& out, const Person& p) const { 
    // access to private members of Person class 
    out << p.firstname << " " << p.lastname << std::endl; 
    out << street << std::endl; 
    out << town << std::endl; 
    out << state << std::endl; 
} 
相關問題