What's the preferred C++ idiom to own a collection of polymorphic objects?

后端 未结 4 794
囚心锁ツ
囚心锁ツ 2021-02-02 13:58

Consider the following classes

class Base {
public:
    virtual void do_stuff() = 0;
};

class Derived : public Base {
public
    virtual void do_stuff() { std::         


        
4条回答
  •  慢半拍i
    慢半拍i (楼主)
    2021-02-02 14:06

    Polymorphic objects have to be handled by pointer or reference. Since their lifetime is probably not bound to a particular scope they will also probably have dynamic storage duration, which means you should use a smart pointer.

    Smart pointers such as std::shared_ptr and std::unique_ptr work just fine in the standard collection types.

    std::vector>
    

    Using this in Owner looks like:

    class Owner {
    public:
        void do_all_stuff() {
            //iterate through all items and call do_stuff() on them
        }
    
        void add_item(std::unique_ptr item) {
            items.push_back(std::move(item));
        }
    
        vector> items;
    }
    

    The argument type to add_item identifies the ownership policy required for adding an item, and requires the user to go out of their way to screw it up. For example they can't accidentally pass a raw pointer with some implicit, incompatible ownership semantics because unique_ptr has an explicit constructor.

    unique_ptr will also take care of deleting the objects owned by Owner. Although you do need to ensure that Base has a virtual destructor. With your current definition you will get undefined behavior. Polymorphic objects should pretty much always have a virtual destructor.

提交回复
热议问题