![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Перегрузка конструктора копирования и оператора присвоения11.02.2012, 14:08. Показов 12061. Ответов 18
Метки нет Все метки)
(
Всем привет, сразу к делу. После прочтения 11 главы Лафоре столкнулся с такой бедой как понятие перегрузка оператора присвоения. Дело в том что Лафоре говорит что именно оператор присвоения является уникальным и не наследуется. Но когда создаёшь указатель на базовый класс там естественно делаешь все методы виртуальными (для полиморфизма), при раз адресации указателя происходит вызов перегруженного оператора присвоения базового класса а не производного который по факту там находиться!! Как же так? Естественно что я перегрузил эти конструкторы и в производных классах. Код ниже подскажите как мне быть?? Как вызвать нужный мне перегруженный оператор?
Базовый класс
Идей заключается в следующем создается в динамической памяти массив указателей на базовый класс. И процессе работы программы на уровне пользователя решается какой класс будет создан вот кусок кода
Добавлено через 1 час 11 минут Если кому интересно, то я решил эту проблему вот так: для класса "тип"
НО возник вопрос-почему так? Неужели если работаешь с указателями при полиморфизме необходимо постоянно вручную преобразовывать указатели? И почему казалось бы альтернативный способ не приносит тех же результатов
функция показывала что в памяти содержиться тот или иной но нужный в конкретной ситуации объект, но всеравно продолжал вызываться перегруженный метод присвоения базового класса. Может кто нибудь объяснить? Ни у Лафоре ни у Павловской я этого не нашёл
0
|
11.02.2012, 14:08 | |
Ответы с готовыми решениями:
18
Перегрузка оператора присвоения Перегрузка оператора присвоения в enum class
|
![]() |
|
11.02.2012, 15:58 [ТС] | 3 |
Сейчас попробую...
Добавлено через 6 минут Нет такой Вариант не годиться т.к. publication я вляется базовым и не знает и уж темболее не имеет соответсвующих полей производных классов. Если сделать как говорите вы то будет потеря данных.
0
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|
11.02.2012, 16:06 | 4 |
раз вас Лафоре не убелил, то хотя бы подобные конструкции должны вас убедить
еще раз: оператор присвоения является уникальным и не наследуется. и в записи писать virtual бесполезно. не будет он виртуальным.
1
|
![]() |
|
11.02.2012, 16:17 [ТС] | 5 |
Спасибо за коментарий, но мне показалось что Вы не поняли сути произходящего.
Да Лафоре сказал что не наследуется, а в моём случае наоборот все время вызывался метот базового класса(то есть можно сказать что "наследовался", по факту это конечно не так это я для объяеснения), когда я вытаскивал содержимое из указателей то там каждый раз были разные производные объекты. Следовательно по словам Лафоре метод "=" базового класса не должен был вызываться. Надеюсь Вы прости те меня за столь подробное объяснение, но надеюсь это прольёт свет на ситуацию.
0
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|||||||||||
11.02.2012, 16:28 | 6 | ||||||||||
вызывается оператор = для статического типа указателя, а не динамического
вот вам вдогонку. не запуская программы, подумайте, что она выведет... а потом проверьте
1
|
![]() |
||||||
11.02.2012, 16:43 [ТС] | 7 | |||||
Вы меня совсем что ли за идиота держите? Либо просто выпендриваетесь передо мной?
Люди обычно спорят когда не понимают либо говорят о разных вещах, так Вот в место того что бы пробовать объяснять то что я и так знаю. Я Вам посоветаю внимательно прочитать мой вопрос, а не придумывать его. Добавлено через 5 минут Мой Вам втречны вопрос: объект какого класса находиться в *(*(temp+i))
0
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|
11.02.2012, 16:56 | 8 |
а я Вам посоветую излагать его по-русски.
хотели знать почему так я вам и обьяснил, что
2
|
![]() |
||||||
11.02.2012, 17:06 [ТС] | 9 | |||||
Я так и думал!! Я полностью с Вами согласен. И это моё упущение что я не предусмотрел что ни кто ни будет в вчитываться в код. И надо было по лучше формировать вопрос. Дело в том что я заметил на этапе отладки что даже вот тут
0
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|
11.02.2012, 17:21 | 10 |
ну так в чем проблема? так и должно быть: оператор= не наследуется, поэтому для указателей на publication вызывается publication::operator= . и нет тут никакого "наследования". вы просто запутались, что значит "наследует".
а вот если бы вызывался book::operator= для указателей на publication(при их разыменовании), то это и было бы наследованием Добавлено через 7 минут если вам понятно это то почему не пнятно, что здесь ситуация аналогичная
1
|
![]() |
||||||||||||||||
11.02.2012, 17:27 [ТС] | 11 | |||||||||||||||
Запутался? Ну тогда объясните что по чему это помогает в этой ситуации
Т.е. если сделать так то все работает т.е.
следующая функция показывает что это объект класса type "тип"
Вопрос тогда почему объект типа "тип" вызвает метод базового класса "издательство".
0
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|||||||||||
11.02.2012, 17:40 | 12 | ||||||||||
не нужно путать статические и динамические типы. первые определяются на этапе компиляции, вторые - на этапе выполнения.
на этапе выполнения в *(*(temp+i)) находится объект типа book(или что там у вас). но компилятору нас*ать, что там на этапе исполнения. на этапе компиляции все что он видит - указатель на publication и генерирует соответствующий код для объектов типа publication. для того, чтобы он на этапе компиляции генерил присваивание book::operator=, придется явно ему это указать, например, так
1
|
![]() |
||||||
11.02.2012, 17:48 [ТС] | 13 | |||||
retmas .. так бы сразу и сказали. Большое спасибо что пролили свет на этот процесс, ну я не удовольствуюсь только Вашим ответом. Позволю себе спросить у Вас где Вы это читали? Я бы хотел поподробней эту ситуацию изучить. Я конечно понимаю что Вы можете мне сказать спросит у Googlе, но всё же может посоветуете где мне поподробней почитать по позднее связывание.
Да и ещё вопрос, на сколько я успел заметить такие проблемы возникают только с оператором присвоения?! Да и ещё Вы показали довольно странный синтаксис
0
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|
11.02.2012, 17:56 | 14 |
У Страуструпа детально изложены все моменты языка. Страницы не скажу, т.к. под рукой нет
![]() приведение в стиле С
1
|
![]() 5057 / 3117 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
11.02.2012, 17:58 | 15 |
stawerfar, чтобы сразу получить ответ, вы должны были выложить сюда минимальный код, повторяющий ошибку вашего изначального кода. Я, лично, зайдя в эту тему и увидев количество кода, просто сразу ушёл отсюда, потому что разбираться во всём этом - сломать глаза и мозг. Я думаю, так поступили многие. Только retmas был в настроении ответить, за что ему плюс.
2
|
![]() |
||||||
11.02.2012, 18:07 [ТС] | 16 | |||||
Это первое что я сделал. Я же писал об этом в начале. Про Бьёрна Страуструпа я слышал но книги не имею, пока..
Ещё раз спасибо,бы ло приятно с Вами беседовать! Добавлено через 4 минуты На верно Вы правы, просто исходя из предыдущего опыта "выкладывания" всего кода - начинаются по моему не нужные разговоры которые просто уводят от темы. Ну например "божемой какой ужастный код", "отвратительно" и т.д.. В ответ этому пишешь ребята "Вы себя нормально чувствуете?". А модератор посетивший чат не вникая в суть БАЦ - 30 ... балов. Добавлено через 3 минуты Да и к стати я выложил минимальный мой код. Вот его не оптимизированная копия (оригинал):
0
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|
11.02.2012, 18:10 | 17 |
не хочу вас расстраивать, но выложив сюда кучу обрывков кода вы нисколько не избавились от возможности таких разговоров.
![]()
1
|
![]() 5057 / 3117 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
11.02.2012, 18:10 | 18 |
stawerfar, это не минимальный код. Минимальный код содержит только функционал, который позволяет повторить ошибку. Он не обязан пересекаться с изначальной задачей, главное - повторить ошибку. Например, если вопрос у вас был по операторам присваивания - вы должны были повторить вашу архитектуру классов, реализовав там только операторы присваивания (в которые, возможно, вставлены отладочные принты), и повторить в main'е только то место, которое вызывало у вас вопросы. Думаю, ваш код занял бы тогда строчек 40-50, и определить проблему было бы куда проще.
1
|
![]() |
|
11.02.2012, 18:14 [ТС] | 19 |
Большое спасибо я обязательно учту на будущее
0
|
11.02.2012, 18:14 | |
Помогаю со студенческими работами здесь
19
Посмотрите описание конструктора копирования и оператора присваивания с ними все в порядке? После функции add теряются данные
Перегрузка присвоения Нестандартное и полезное применение оператора присвоения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Опции темы | |
|
Новые блоги и статьи
![]() |
||||
Циклы for в Python
py-thonny 17.03.2025
Существует множество ситуаций, когда нам нужно выполнить одно и то же действие несколько раз. Цикл for в Python — настоящий рабочий конь для большинства программистов. Если вам нужно пройтись по всем. . .
|
Предсказание ветвлений - путь к высокопроизводительному C++
NullReferenced 17.03.2025
В высокопроизводительном программировании на C++ каждый такт процессора на счету. Когда речь заходит о разработке систем с низкой задержкой — будь то высокочастотная торговля, обработка потоковых. . .
|
Паттерн CQRS в C#
UnmanagedCoder 17.03.2025
Создание сложных корпоративных приложений часто требует нестандартных подходов к архитектуре. Один из таких подходов — паттерн CQRS (Command Query Responsibility Segregation), предлагающий простую,. . .
|
Паттерн Цепочка ответственности в C#
UnmanagedCoder 17.03.2025
Цепочка ответственности — это поведенческий паттерн проектирования, который позволяет передавать запросы последовательно по цепочке потенциальных обработчиков, пока один из них не обработает запрос. . . .
|
Создаем микросервисы с NestJS, TCP и Typescript
run.dev 17.03.2025
NestJS — фреймворк, который значительно упрощает создание серверных приложений на Node. js. Его прелесть в том, что он комбинирует концепции ООП, функционального программирования и предлагает. . .
|
Гексагональная архитектура со Spring Boot
Javaican 17.03.2025
Если вы когда-нибудь сталкивались с ситуацией, когда внесение простых изменений в базу данных или пользовательский интерфейс заставляло вас переписывать весь код, то вы точно оцените элегантность. . .
|
Позиционирование Kafka Consumer и Seek-операции
Javaican 17.03.2025
Что же такое Consumer Seek в Kafka? По сути, это API-метод, который позволяет программно указать, с какой позиции (offset) Consumer должен начать или продолжить чтение данных из партиции. Без этого. . .
|
Python NumPy: Лучшие практики и примеры
py-thonny 17.03.2025
NumPy (Numerical Python) — одна из ключевых библиотек для научных вычислений в Python. Она превращает Python из просто удобного языка общего назначения в среду для проведения сложных математических. . .
|
Java Micronaut в Docker: контейнеризация с Maven и Jib
Javaican 16.03.2025
Когда речь заходит о микросервисной архитектуре на Java, фреймворк Micronaut выделяется среди конкурентов. Он создан с учётом особенностей облачных сред и контейнеров, что делает его идеальным. . .
|
Управление зависимостями в Java: Сравнение Spring, Guice и Dagger 2
Javaican 16.03.2025
Инъекция зависимостей (Dependency Injection, DI) — один из фундаментальных паттернов проектирования, который радикально меняет подход к созданию гибких и тестируемых Java-приложений. Суть этого. . .
|