Информация об изменениях

Сообщение Re: Доступ к copy-ctor через отдельный метод от 24.03.2022 6:55

Изменено 24.03.2022 6:56 Igore

Re: Доступ к copy-ctor через отдельный метод
Здравствуйте, _hum_, Вы писали:

__>Появилась задача добавить уже существующему классу возможность клонирования его объектов (изначально такой возможности не было — копирование было запрещено). Поскольку класс довольно массивный, то есть опасения, что при написании конструкторов копирования будут ошибки. По этой причине, не хотелось бы открывать эти конструкторы копирования для полного доступа, тем самым открывая возможность их неявного вызова в коде. Хотелось бы, чтобы вызовы конструкторов были только для задачи клонирования, и соответственно, осуществлялись явно. На ум тут пришло следующее решение:

__>
__>class CA
__>{
__>    std::unique_ptr<int> m_ui;
__>    //^^^^^^^^^^^^^^^^^^^^^^^
__>    explicit 
__>    CA(const CA& o)
__>        :m_ui(new int(*o.m_ui))
__>    {}
__>    //-----------------------
__>public:
__>    //-----------------------
__>    CA(int i):
__>      m_ui(new int(i))
__>    {}
__>    //-----------------------
__>    CA(CA&&)=default;
__>    //-----------------------
__>    CA clone(){ return CA(*this);}
__>    //-----------------------
__>    int get(){return *m_ui;}
__>    //-----------------------
__>};

__>

__>Но насколько оно соответствует заявленной цели,
По виду не соответсвует, clone != move, у тебя по после такого clone сам объект теряет владение над m_ui
__>и может, есть что-нибудь красивее?
Ну, сама идея вроде правильная, пишем operator = в private и в public clone используем, придется да акуратно написать копирование, других вариантов в голову не приходит
__>(И, на всякий случай, есть ограничения — в функции clone нельзя использовать работу с динамической памятью).
С таким ограничением непонятно как это сделать, если только переопределять new и использовать заранее выделеную память
Re: Доступ к copy-ctor через отдельный метод
Здравствуйте, _hum_, Вы писали:

__>Появилась задача добавить уже существующему классу возможность клонирования его объектов (изначально такой возможности не было — копирование было запрещено). Поскольку класс довольно массивный, то есть опасения, что при написании конструкторов копирования будут ошибки. По этой причине, не хотелось бы открывать эти конструкторы копирования для полного доступа, тем самым открывая возможность их неявного вызова в коде. Хотелось бы, чтобы вызовы конструкторов были только для задачи клонирования, и соответственно, осуществлялись явно. На ум тут пришло следующее решение:

__>
__>class CA
__>{
__>    std::unique_ptr<int> m_ui;
__>    //^^^^^^^^^^^^^^^^^^^^^^^
__>    explicit 
__>    CA(const CA& o)
__>        :m_ui(new int(*o.m_ui))
__>    {}
__>    //-----------------------
__>public:
__>    //-----------------------
__>    CA(int i):
__>      m_ui(new int(i))
__>    {}
__>    //-----------------------
__>    CA(CA&&)=default;
__>    //-----------------------
__>    CA clone(){ return CA(*this);}
__>    //-----------------------
__>    int get(){return *m_ui;}
__>    //-----------------------
__>};

__>

__>Но насколько оно соответствует заявленной цели,
По виду не соответсвует, clone != move, у тебя после такого clone сам объект теряет владение над m_ui
__>и может, есть что-нибудь красивее?
Ну, сама идея вроде правильная, пишем operator = в private и в public clone используем, придется да акуратно написать копирование, других вариантов в голову не приходит
__>(И, на всякий случай, есть ограничения — в функции clone нельзя использовать работу с динамической памятью).
С таким ограничением непонятно как это сделать, если только переопределять new и использовать заранее выделеную память