c++中的对象组合与嵌套类.我该用哪个呢?

Object composition vs Nested class in C++.Which shall I use when?

本文关键字:对象 组合 嵌套 c++      更新时间:2023-10-16

c++提供了两个类似的条款来执行相同的任务。而对象组合似乎更方便,因为声明的类也可以用于其他类。

。"Address"类可以包含一些属性和函数,然后用作"Student"类的属性。或者,'Address'类也可以在'Student'类中声明(嵌套)。

所以我的疑问是,这些方法应该使用哪一种,什么时候使用?另外,是否认为一种方法比另一种方法更好?

Student类拆分为Address类没有多大意义,除非有其他"东西"也需要Address(见下文)-更合理的方法是有一个Person类,然后从Person派生Student -以及Teacher, Dean或任何其他可能需要描述学校的类。这里的关键是看"什么是共同的,什么是单独的"。

但是在某些情况下AddressAddressable类是有用的。如果我们想要跟踪家庭,并且希望在某种形式的数据库(例如保险公司)中只有两个成年人,两个孩子,一条狗,一所房子和一辆车的整个家庭的Address项,那么拥有单独的Address可能确实有意义。如果家里的儿子(或女儿)后来搬去上大学,他将得到一个新的单独的地址(以及一张账单,以支付上大学与与母亲住在一起的额外风险)。爸爸)。

或者如果我们必须跟踪非Person的事物-假设您不仅需要人员,还需要具有Address的建筑物和设备。那么为"非人"answers"人"提供一套通用的功能就更有意义了。

这真的取决于你的目标是什么,你真的需要考虑数据的使用。没有一个确切的固定答案。分割太多和组合太多一样糟糕。

如果我正确理解你的问题,它是关于类定义一个子对象(这里Address)是否应该在包含类内部与包含类(这里Student)在同一级别上声明。

主要区别在于从子对象访问封闭类的私有或受保护成员。嵌套类是其外围类的成员,可以访问所有的私有成员(参考:11.7)。[/p] .

下面是一个嵌套类访问其封闭类的私有成员的示例:

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