Запрет конструктора копирования в базовом классе
От: Videoman Россия https://hts.tv/
Дата: 19.08.15 09:41
Оценка:
Всем добрый день!
Кто-нибудь из экспертов может объяснить что тут происходит и почему данный код компилируется ?

В двух словах: есть базовый класс с запрещенным конструктором копирования, наследник от него со своим конструктором копирования вызывает не конструктор базового, а конструктор по-умолчанию. Так и должно быть?
Re: Запрет конструктора копирования в базовом классе
От: uzhas Ниоткуда  
Дата: 19.08.15 09:53
Оценка:
Здравствуйте, Videoman, Вы писали:

V>В двух словах: есть базовый класс с запрещенным конструктором копирования, наследник от него со своим конструктором копирования вызывает не конструктор базового, а конструктор по-умолчанию. Так и должно быть?

конструктор копирования написан явно:
Test(const Test& other) : m_val(other.m_val) {}


и там нет попытки вызвать приватный конструктор из базового класса

паттерн noncopyable используют чаще против неявного копирования, то есть когда конструктор копии для класса Test не написан явно
смотрим: https://ideone.com/HReM1O
Re[2]: Запрет конструктора копирования в базовом классе
От: Videoman Россия https://hts.tv/
Дата: 19.08.15 10:03
Оценка: :))
Здравствуйте, uzhas, Вы писали:

U>и там нет попытки вызвать приватный конструктор из базового класса


там нет и попытки вызвать конструктор по умолчанию, а он вызывается

U>паттерн noncopyable используют чаще против неявного копирования, то есть когда конструктор копии для класса Test не написан явно

U>смотрим: https://ideone.com/HReM1O

Т.е. мой случай никак обезопасить нельзя, может модно что-нибудь добавить?
Re: Запрет конструктора копирования в базовом классе
От: Carc Россия https://vk.com/gosha_mazov
Дата: 19.08.15 10:08
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Всем добрый день!

V>Кто-нибудь из экспертов может объяснить что тут происходит и почему данный код компилируется ?

V>В двух словах: есть базовый класс с запрещенным конструктором копирования, наследник от него со своим конструктором копирования вызывает не конструктор базового, а конструктор по-умолчанию. Так и должно быть?

Насколько я понимаю, да, так и должно быть. Базовый конструктор (копирования) не вызывается автоматически, имхо все нормально.
Aml Pages Home
Re[3]: Запрет конструктора копирования в базовом классе
От: VTT http://vtt.to
Дата: 19.08.15 10:13
Оценка: +1
Здравствуйте, Videoman, Вы писали:

V> там нет и попытки вызвать конструктор по умолчанию, а он вызывается


конструктор по-умолчанию для того и нужен, чтобы вызываться, когда не вызывается какой-либо другой конструктор

V>Т.е. мой случай никак обезопасить нельзя, может модно что-нибудь добавить?


поясните, что значит "обезопасить"?
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Отредактировано 19.08.2015 10:14 VTT . Предыдущая версия .
Re[3]: Запрет конструктора копирования в базовом классе
От: ajanov  
Дата: 19.08.15 10:52
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Здравствуйте, uzhas, Вы писали:


U>>и там нет попытки вызвать приватный конструктор из базового класса


V> там нет и попытки вызвать конструктор по умолчанию, а он вызывается


В своем коде ты явно создаешь конструктор копирования:

Test(const Test& other) : m_val(other.m_val) {} // <== Здесь вызывается конструктор предка по умолчанию, он protected и доступ к нему не запрещен


Если конструктор копирования явно не указывать, то компилятор создаст его самостоятельно, и будет выглядеть он как следующий псевдокод:

Test(const Test& other)
    : noncopyable(other) // Сначала копируется предок, а его конструктор копирования - private => ошибка компиляции
    , m_val(other.m_val)
{}


Таким образом копирования объектов предка также оказывается запрещенным.

U>>паттерн noncopyable используют чаще против неявного копирования, то есть когда конструктор копии для класса Test не написан явно

U>>смотрим: https://ideone.com/HReM1O

V>Т.е. мой случай никак обезопасить нельзя, может модно что-нибудь добавить?


А собственно, от чего ты хочешь защититься? Наследник явно разрешает копирование его объектов, так как в нем явно определен конструктор копирования.
Re[3]: Запрет конструктора копирования в базовом классе
От: dead0k  
Дата: 19.08.15 11:10
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Т.е. мой случай никак обезопасить нельзя, может модно что-нибудь добавить?


Я правильно понял, ты хочешь, чтобы экземпляр класса нельзя было копировать, но при этом добавляешь конструктор копирования? А зачем?
Нет, если уж очень хочется, то делай правильно:
...
Test(const Test& other) 
    : noncopyable(other)
    , m_val(other.m_val) 
    {}

компилироваться не будет, гарантирую это.
Re: Запрет конструктора копирования в базовом классе
От: Videoman Россия https://hts.tv/
Дата: 19.08.15 11:28
Оценка:
Спасибо большое всем ответившим!
Поскольку встречные вопросы примерно у всех одинаковые, то постараюсь ответить всем одним сообщением.
Проблема была в том, что я нечаянно создал конструктор копирования у класса у которого его не должно быть. По-идее именно от таких случаев и должен спасать noncopyable, а он подвел. Раньше был уверен, что из конструктора копирования, по-умолчанию (если не указывать), вызывается конструктор копирования базового класса. Теперь буду знать что это не так.
Отредактировано 19.08.2015 11:30 Videoman . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.