Как понять, где я должен удалить конструктор копирования и оператор присваивания?
Я пишу игру и основываюсь уже на написанном коде. Читаю код и делаю по аналогии, разбираясь заодно со всякими фишками. В коде наткнулся на следующее:
class InputManager final : public Currenton<InputManager>
{
private:
friend class KeyboardMenu;
friend class JoystickMenu;
public:
InputManager(KeyboardConfig& keyboard_config,
JoystickConfig& joystick_config);
~InputManager() override;
void process_event(const SDL_Event& event);
void update();
void reset();
void use_game_controller(bool v);
bool use_game_controller() const { return m_use_game_controller; }
const Controller& get_controller() const;
Controller& get_controller();
private:
std::unique_ptr<Controller> controller;
public:
bool& m_use_game_controller;
std::unique_ptr<KeyboardManager> keyboard_manager;
std::unique_ptr<JoystickManager> joystick_manager;
std::unique_ptr<GameControllerManager> game_controller_manager;
private: /*<- Вот этот МОМЕНТ */
InputManager(const InputManager&) = delete; /*<- Вот этот МОМЕНТ */
InputManager& operator=(const InputManager&) = delete; /*<- Вот этот МОМЕНТ */
};
Почему разработчики удаляют оператор присваивания и конструктор копирования в private поле? С чем это связано? Ведь они определены в public по дефолту. Какая разница между удалением в private и public ? Есть ли какая-то разница между удалением конструктора в поле public и private или это вопрос стиля написания кода ?
Ответы (2 шт):
Какая разница между удалением в private и public ?
Никакой. Мне кажется нагляднее удалять в public.
Обычно, конструктор копирования и оператор присваиваивания делают приватными, чтобы объект нельзя было копировать "извне". Я так понял, этот код не ваш и вы просто хотите в нём разобраться. Скорее всего, автор кода не хотел, чтобы класс был где-то скопирован, поэтому поместил эти методы в private, а после и вовсе решил, что объект копировать нельзя (нарушает логику или что-то подобное) и удалил эти два метода. Удалять в public или в private - разницы нет.