![]() |
|
Модераторы: bsa |
![]()
|
|
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Я полагаю, это высказывание основано на умозаключении что все конструкторы одинаковы. К сожалению это не так, и конструктор копий особый среди констукторов, а копирования рассматривается как отдельная тема.
12.8/14
Следовательно : Это сообщение отредактировал(а) mes - 5.3.2010, 22:44 |
||||||
|
|||||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Ошибочно полагаете. Это утверждение основано на том, что не возникает ошибки, если в копирующем конструкторе инициализировать базовый класс не копирующим, а другим конструктором. Мой случай под это не подпадает, так как я не использую неявно недоступную специальную функцию. Так что не убедили. |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
ваш конструктор копирования может бросить исключение во время раскрутки стека и завалить все приложение, теперь убедил?
|
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Это относится к любому конструктору копирования, а не только к моему. Вы же сами сказали: чтобы объект можно было бросать, у его класса должен быть конструктор копирования и оператор присваивания. Эти условия выполнены. Так какого же х..а? Добавлено через 7 минут и 23 секунды Поставим вопрос по другому: кто-нибудь может сказать, что именно в данный момент делает компилятор, что у него не выходит? Вот по третьему примеру отсюда http://forum.vingrad.ru/index.php?showtopi...t&p=2109551 я понимаю так: компилятор создаёт объект A(), а затем пытается инициализировать a ссылкой на него; он видит, что конструктор по ссылке приватный и выдаёт ошибку. Вот по этому примеру http://forum.vingrad.ru/index.php?showtopi...t&p=2110227 я понимаю так: поскольку в классе B отсутствует копирующий конструктор, компилятор составляет его сам; там он пишет, мол, вызвать копирующий конструктор базового класса; а он у нас приватный приватный -- бац -- ошибка Как можно подобным образом объяснить ошибку в моём случае? |
|||
|
||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
если есть, то имеете, но обращаться к закрытым членам класса это права не дает такого
у вас bad_alloc может быть брошено |
||||
|
|||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Да Вы не используете, но
так что сжульничать не получится
если этот вопрос и теперь актуален, то я могу в грубом примере пояснить что происходит Это сообщение отредактировал(а) mes - 6.3.2010, 01:44 |
||||||
|
|||||||
| Dims |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Где я к ним обращаюсь, какой номер строки?
Не понимаю этой фразы.
Конечно, прошу Вас. Добавлено через 14 минут и 5 секунд То есть, Вы дополняете свои первоначальные требования? Теперь их список таков: 1) класс должен иметь копирующий конструктор 2) класс должен иметь оператор присваивания 3) класс не должен мочь выбросить bad_alloc так? Вот контрпример, он компилируется, хотя условие 3 нарушено
|
||||||
|
|||||||
| Леопольд |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
А так в общем случае:
Это сообщение отредактировал(а) Леопольд - 6.3.2010, 01:10 -------------------- вопросов больше чем ответов |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Конструктор копии используется даже тогда, когда реализация фактически обходит его использование. Вот иллюстрация сказанного:
раскомментируйте "private:" для получения ошибки, не смотря на то что реализация не использует конструктор копии класса А. Добавлено @ 01:22 нет, пункт 3 не по теме. Это сообщение отредактировал(а) mes - 6.3.2010, 01:42 |
|||
|
||||
| Dims |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Как же она его не использует, когда он используется в макросе __CHECK_COPYABLE? Я не вижу тут никакого неявного использования -- тут есть явное. Ха! Ну и что, что мы не знаем? В макросе вызывается копирующий конструктор, его вызов присутствует, в него можно ткнуть пальцем. А ткните-ка пальцем, где копирующий конструктор базового класса используется в моём примере?
Почему тогда компилируется другой пример, где нет throw? Добавлено через 5 минут и 8 секунд Ха! А вот такой код:
Работает. Проверил на VS и codepad: http://codepad.org/TViM3EQq |
||||||
|
|||||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
copy elision - это такая оптимизация, компилятор, в некоторых случаях может не копировать объект, передаваемый в качестве параметра или возвращаемый из функции, а использовать уже существующий
во первых не только bad_alloc, а любое исключение, во вторых, компилятор это никак не контролирует, просто твое приложение может упасть во время обработки какого-нибудь исключения вообще, я не понимаю, почему не компилируется твой код, у меня нет под рукой компилятора, что-бы в этом разобраться, ясно только то, что происходит обращение к закрытому члену класса, где именно я не знаю я бы на вашем месте, посмотрел на реализацию bsa, только унаследовал бы класс от std::exception |
||||
|
|||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
А, ну это понятно: оптимизация никогда не должна сказываться на логике.
Да я уже давно написал при помощи агрегации; теперь мне просто интересно, почему так себя ведёт компилятор в данном случае. |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
-------------------- вопросов больше чем ответов |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
так о том и речь : Наша реализация обходит использование копи-конструктора, но он все равно используется компилятором. т.е несмотря на программисту не нужен, компилятор его проверяет.
Ну-ка ткните пальцем
Это сообщение отредактировал(а) mes - 6.3.2010, 12:56 |
||||||
|
|||||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
компилируется не значит работает еще раз для закрепления :
и вообще некрасиво разрешать наследнику копирование, когда открытая база запрещает.. нарушение логики при приведении. Это сообщение отредактировал(а) mes - 6.3.2010, 14:45 |
||||
|
|||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |