|
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
|||||||||||
Переопределение операции присваивания29.07.2014, 04:21. Показов 5209. Ответов 40
Метки нет (Все метки)
Есть вот такой класс:
Заранее спасибо. Добавлено через 7 минут Вследствие чего выводистя окно с ошибкой, как я понимаю из за того, что деструктор пытается удалить несуществующий блок памяти.
0
|
|||||||||||
| 29.07.2014, 04:21 | |
|
Ответы с готовыми решениями:
40
Переопределение операции присваивания Переопределение оператора присваивания Для чего нужно переопределение оператора присваивания? |
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|||||
| 29.07.2014, 08:20 | |||||
|
Конструкторы, которые их инициализируют:
0
|
|||||
|
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
|||||||||||||||||||||||
| 29.07.2014, 08:26 [ТС] | |||||||||||||||||||||||
|
Вот:
1) Базовое: (обьявлено также вирутальным)
0
|
|||||||||||||||||||||||
|
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
|
||||||
| 29.07.2014, 08:30 | ||||||
|
а кто будет определять для производного класса это:
он у тебя не определён, так? - что в таком случае будет, когда объект производнго, присвоишь объекту производного? наверняка операция присвоения по умолчанию и как ты думаешь она работает?. И я бы ещё на твоём месте подумал над тем, что тебе выше написал alsav22,
0
|
||||||
|
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
||||||||||||||||
| 29.07.2014, 08:35 [ТС] | ||||||||||||||||
|
По идее сначало должно вызыватся присвоение определенное в производном класе т.к.
0
|
||||||||||||||||
|
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
|
||
| 29.07.2014, 08:37 | ||
|
И по поводу, когда производному присваивается базовый:
что тебе просто мешает сделать указатель на nullptr? к тому же такое приведение типа не очень хорошая практика, тем более она здесь совсем не оправдана
0
|
||
|
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
||
| 29.07.2014, 08:39 [ТС] | ||
|
0
|
||
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
| 29.07.2014, 08:42 | |
|
0
|
|
|
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
||
| 29.07.2014, 08:42 [ТС] | ||
|
0
|
||
|
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
|
||
| 29.07.2014, 08:42 | ||
|
0
|
||
|
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
|||
| 29.07.2014, 08:48 [ТС] | |||
|
Добавлено через 4 минуты Можно просто определить не виртуальную и не переопределенную а отдельную операцию присвоения в производном классе Classic. Но мне просто интересно почему не работает тот код, ведь в теории вроде все сходится.
0
|
|||
|
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
|
|||
| 29.07.2014, 08:50 | |||
|
0
|
|||
|
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
|||||||
| 29.07.2014, 09:00 [ТС] | |||||||
0
|
|||||||
|
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
|
||||||||||
| 29.07.2014, 09:19 | ||||||||||
|
как ты из объекта c, который является экземпляром класса Cd, вытащишь свойство main_cmps??? даже если ты сделаешь приведение типа для него, с какого перепугу ты решил, что там возьмётся корректное значение main_cmps? сам родит и угадает, что там должно оказаться? именно поэтому и не рекомендуется так делать, как сделал ты. у производного объекта, есть все свойства, которые есть у базового, у базового не все, которые есть у производного, поэтому и нельзя присваивать базовый, производному. Приведение типа доступно только для того, чтобы если бы ты точно был уверен, что в какой-то функции используются только базовые методы и свойства какого-то класса, но при этом, функция принимает только объекты производного класса, у тебя бы всё равно оставалась возможность передать объект - у тебя это не так, ты пытаешься воспользоваться свойством производного класса. Ты присваиваешь объект базового типа производному, используя привидение типа, ок, но у него ВСЁ РАВНО НЕТУ СВОЙСТВА ПРОИЗВОДНОГО КЛАССА, ОНО НЕ ПОЯВЛЯЕТСЯ ПО ВОЛЕ БОЖЬЕЙ. Добавлено через 7 минут как ты из объекта c, который является экземпляром класса Cd, вытащишь свойство main_cmps??? даже если ты сделаешь приведение типа для него, с какого перепугу ты решил, что там возьмётся корректное значение main_cmps? сам родит и угадает, что там должно оказаться? именно поэтому и не рекомендуется так делать, как сделал ты. у производного объекта, есть все свойства, которые есть у базового, у базового не все, которые есть у производного, поэтому и нельзя присваивать базовый, производному. Приведение типа доступно только для того, чтобы если бы ты точно был уверен, что в какой-то функции используются только базовые методы и свойства какого-то объекта, но при этом, функция принимает только объекты производного класса - у тебя это не так. Ты присваиваешь объект базового типа производному, используя привидение типа, ок, но у него ВСЁ РАВНО НЕТУ СВОЙСТВА ПРОИЗВОДНОГО КЛАССА, ОНО НЕ ПОЯВЛЯЕТСЯ ПО ВОЛЕ БОЖЬЕЙ.
0
|
||||||||||
|
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
||
| 29.07.2014, 09:20 [ТС] | ||
|
И если здесь все и так, как ты говоришь, то компилятор все равно не исполняет этот код. Я уже говорил что вызывается не это присвоение, а присвоение, которое определено в базовом классе.
0
|
||
|
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
|
|||||||||||
| 29.07.2014, 09:22 | |||||||||||
|
ох)
0
|
|||||||||||
|
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
||
| 29.07.2014, 09:28 [ТС] | ||
|
Но все равно вызвается даже не это присваение а базовое.
0
|
||
|
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
||||||
| 29.07.2014, 09:38 [ТС] | ||||||
0
|
||||||
|
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
|
|||||||||||||||||
| 29.07.2014, 09:51 | |||||||||||||||||
Сообщение было отмечено Gwini как решение
Решение
если честно, я не помню, как досконально происходит приведение типа поэтому не могу ответить на твой вопрос по поводу того, какое присвоение будет вызвано, домой приду, сам ещё разбираться буду) Но факт в том, что у полученого объекта, который ты приводишь к типу производного класса просто не будет свойства, которое ты пытаешься скопировать и получить его длину strlen; Попробуй сейчас оставить только присвоение вида Classic& Classic::operator=(Cd &cd); только не делай этого в методе - Classic temp = (Classic &)cd а просто дай нулевой указатель свойству main_cmpc, проверь, будет ли ошибка Добавлено через 6 минут тьфу ты) само собой у тебя будет вызываться сначала оператор присваивания базового класса. Тебе же сначала нужно задать значения для свойств базового класса, так? для этого вызываем оператор присваивания БАЗОВОГО класса Cd::operator=(argument) - у тебя были эти строки, я помню Добавлено через 2 минуты
1
|
|||||||||||||||||
|
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
|||
| 29.07.2014, 09:56 [ТС] | |||
|
Я вот думаю что для операции присвоения просто действуют строгие правила по поводу аргументов и нужно явно указать тип. И те правила что действуют для обычних методов не действуют для операции присвоения. Хотя для конструкторов действуют, так что я не уверен. В любом случае спасибо что уделил время и если узнаешь что то об этих правилах, то напиши пожалуйста. Удачи ![]() Добавлено через 2 минуты
0
|
|||
|
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
|
|
| 29.07.2014, 09:57 | |
|
Кури ответ выше и забудь ты про это приведение типа уже)
0
|
|
| 29.07.2014, 09:57 | |
|
Перегрузка операции присваивания и сложения
Переопределение операции инкремента Переопределение операции ввода Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг.
Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует.
В процессе разработки. . .
|