C++提供了兩個類似的規定來執行相同的任務。雖然對象組合似乎更方便,因爲聲明的類也可以用於其他類。對象組合vs C++中的嵌套類我應該在什麼時候使用?
例如, 「地址」類可以包含一些屬性和功能,然後可以用作「學生」類的屬性。 或者,'Address'類可以在'Student'類(嵌套)中聲明。
所以我的疑問是,這些方法中哪一個應該使用,什麼時候使用? 也被認爲比另一個更好的方法?
C++提供了兩個類似的規定來執行相同的任務。雖然對象組合似乎更方便,因爲聲明的類也可以用於其他類。對象組合vs C++中的嵌套類我應該在什麼時候使用?
例如, 「地址」類可以包含一些屬性和功能,然後可以用作「學生」類的屬性。 或者,'Address'類可以在'Student'類(嵌套)中聲明。
所以我的疑問是,這些方法中哪一個應該使用,什麼時候使用? 也被認爲比另一個更好的方法?
拆分Student
類爲Address
類沒有太大意義,除非有其他的「東西」需要一個Address
太(見下文) - 一個更合理的做法是有一個Person
類,然後派生Student
從Person
- 以及Teacher
,Dean
或任何其他類可能需要描述一所學校。這裏的關鍵是要看「什麼是共同的,什麼是分離的」。
但有些情況下Address
或Addressable
類是有用的。如果我們想跟蹤家庭,並且想要爲兩個大人,兩個孩子,一個狗,一個房子和一輛汽車以某種形式的數據庫(例如保險公司)只有一個Address
的項目,那麼有一個單獨的Address
可能確實有道理。如果家中的兒子(或女兒)然後搬去上大學,他將得到一個新的單獨地址(以及一個法案,以涵蓋在大學裏與父母生活在一起的額外風險)。
或者如果我們必須跟蹤非Person
的東西 - 比如說你不只有人,而且還有需要有Address
的建築物和設備。然後,爲「非人」和「人」設置一套通用的功能會更有意義。
這實際上取決於你的目標是什麼,你真的需要考慮使用數據。沒有實際的固定和堅定的答案。分裂太多與合併太多一樣糟糕。
如果我正確理解你的問題,它是關於定義子對象的類(這裏是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;
}
可能重複(http://stackoverflow.com/questions/49002/偏好合成 - 繼承) – Spacemoose
@Spacemoose我看不到任何遺傳。 –
我想他的意思是詢問'Address'是否應該在'Student'內聲明。 –