Правило пяти при использовании полиморфизма

Я пытаюсь понять правило пяти при использовании интерфейсов (во всяком случае, концепции) и абстрактных классов и изо всех сил пытаюсь понять, как работают правила.

Предположим, у меня есть такой макет:

      #include <memory>
#include <optional>
#include <string>

class IEventInterface {
    protected:
        IEventInterface() = default;
        
    public:
        virtual ~IEventInterface() = default;
        
        /* rule of 5 says i need these too (https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rc-five) */
        IEventInterface(const IEventInterface&) = delete;               // copy constructor
        IEventInterface& operator=(const IEventInterface&) = delete;    // copy assignment
        IEventInterface(IEventInterface&&) = delete;                    // move constructor
        IEventInterface& operator=(IEventInterface&&) = delete;         // move assignment
        
        virtual std::optional<std::string> getEventText() noexcept = 0;
        virtual bool isEnabled() noexcept = 0;
};

class AbstractEvent : public IEventInterface {
    public:
        AbstractEvent() : m_enabled { true } {}
        virtual ~AbstractEvent() = default;
        
        /* Do i need to disable the other copy/move operators here too? */
        
        bool isEnabled() noexcept override {
            return m_enabled;
        }
    private:
        bool m_enabled;
};

class EventToday final : public AbstractEvent {
    public:
        EventToday() = default;
        virtual ~EventToday() {
            // some additional cleanup steps are required so no default here
        }
        
        std::optional<std::string> getEventText() noexcept override {
            // some code here to get the event text....
        }
        std::unique_ptr<Collector> m_collector;
        
        /* Do i need to disable the other copy/move operators here too? */
};

в каком-то другом коде у меня есть вектор, полный IEventInterface, например std::vector<std::unique_ptr<IEventInterface>> m_events;

Где правильное место для обеспечения соблюдения правила пяти правил? Поскольку классу нужен деструктор, определенный для некоторой очистки, которую им нужно будет запустить, но я не уверен, где? В приведенном выше примере они есть в классе интерфейса, но я подозреваю, что это неправильно, потому что не требуется определения или удаления для любого из копирования / перемещения / деструктора в интерфейсе или абстрактном классе.

0 ответов

Другие вопросы по тегам