|
0 / 0 / 0
Регистрация: 02.10.2009
Сообщений: 5
|
|||||||||||
Проблема с абстрактными классами и перегрузкой операторов02.10.2009, 12:12. Показов 6553. Ответов 10
добрый день. в общем ситуация такая: есть несколько классов, наследуемых от абстрактного класса. Нужно реализовать чтобы можно было переопределять оператор +. Опишу кодом:
может чего посоветуете UPD: опишу по-подробнее. нужно чтобы работал такой код (ну или наподобии)
0
|
|||||||||||
| 02.10.2009, 12:12 | |
|
Ответы с готовыми решениями:
10
Проблема с перегрузкой операторов '-' >> << и с конструктором без параметров Работа с абстрактными классами Проблема с перегрузкой операторов "+" и "+=" для классов Point и Circle |
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||||||
| 02.10.2009, 20:33 | ||||||
|
Ну судя по приведённому коду, тебе надо возвращать не Abstract, а Abstract*. Так ты можешь невозбранно создавать через new производный класс и возвращать указатель на него. Это раз. Операция сложения определена, естественно, для объектов, а не для указателей на них, так что придётся писать
0
|
||||||
|
0 / 0 / 0
Регистрация: 02.10.2009
Сообщений: 5
|
||||
| 03.10.2009, 10:24 [ТС] | ||||
меня на самом деле тут волнует как мне вернуть экземпляр абстрактного класса, и желательно через стек (чтобы потом сам удалился) я пробовал возвращать ссылку на объект, но "затирается"
0
|
||||
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
| 03.10.2009, 15:12 | |
|
Абстрактный класс на то и абстрактный, что создавать его экземпляры нельзя. Можно создавать объекты только конкретного класса. В твоём случае явно вылезает дефект проектирования, так что задумайся о переделке замысла. Например, создай конкретный класс, включающий в себя компоненты с виртуальным интерфейсом. Кроме того, неясно, как ты собираешься производить операции между потомками, не зная их реального типа. Возможно, есть смысл подумать о двойной диспетчеризации. В общем и целом о том, что ты задумал, известно слишком мало и дать более дельный совет я смогу только после ознакомления с подробностями: что ты делаешь и зачем, и почему ты выбрал именно такое решение.
0
|
|
|
47 / 47 / 3
Регистрация: 07.01.2009
Сообщений: 297
|
||||||
| 03.10.2009, 15:57 | ||||||
|
А зачем возвращать указатель на объект в операторе +??? Он для этого не предназначен. Он должен что-л. делать и возвращать результат, но не указатель на объект.Для этого создай функцию какую-н. функцию.А вообще чобы правильно удлаить объект,нужно делать виртуальный конструктор,и тогда все нормально удалится. А если нужно тебе врнуть указатель на класс, и у тебя функция виртульная,то возвращаемое значение должно быть указатель на абстрактный класс, а в main делаешь dynamic_cast
0
|
||||||
|
0 / 0 / 0
Регистрация: 02.10.2009
Сообщений: 5
|
|
| 03.10.2009, 19:29 [ТС] | |
|
отобразил, что мне нужно в UML.
2Ёрик: спасибо попробую
0
|
|
|
47 / 47 / 3
Регистрация: 07.01.2009
Сообщений: 297
|
|
| 03.10.2009, 21:20 | |
|
Тьфу не виртуальный конструктор,а ДЕСТРУКТОР,потому что конструкторов не бывает(если не брать ввиду фабрику объектов)
0
|
|
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
| 04.10.2009, 12:02 | |
|
Намекну ещё разик - с интерфейсом IVariable ты сможешь взаимодействовать только через указатели и ссылки. Он на то и интерфейс, чтобы определять только способ взаимодействия с объектами. Объектов IVariable ты создать не сможешь, а создавать сможешь только IntVariable и DoubleVariable. Кто из них должен быть результатом операции + в каждой из 4 возможных комбинаций аргументов? (кстати, как раз похоже на подходящий случай для применения двойной диспетчеризации).
0
|
|
|
0 / 0 / 0
Регистрация: 02.10.2009
Сообщений: 5
|
|||||||
| 04.10.2009, 20:51 [ТС] | |||||||
|
ладно. отойдем от моего конкретного случая. возьмем другой - аналогичный. есть метод, который должен вернуть ссылку на интерфейс. есть два варианта:
2 - через динамическую память. все круто, но деструктор не вызовется -> надо следить когда мне вручную это деструктор вызвать. дак вот собственно вопрос - правильно ли я мыслю, и есть ли решение?
0
|
|||||||
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||||||
| 04.10.2009, 22:31 | ||||||
|
Общепринятая практика такова, что с интерфейсами работают всё-таки через указатели. Это связано с тем, как создаются объекты, в особенности с указателями на VMT. Так что для использования преимуществ автоматических объектов я рекомендую возвращать указатель и хранить его в smart-pointer - auto_ptr или самописном, поскольку дни auto_ptr сочтены. (ну, точнее, для auto_ptr нашли замену и надо пользоваться ей, но я не помню точно, какая именно, а самописный "умный указатель" очень полезен и нагляден)
0
|
||||||
|
0 / 0 / 0
Регистрация: 02.10.2009
Сообщений: 5
|
|
| 05.10.2009, 14:53 [ТС] | |
|
спасибо огромное всем.
сам поискал решение проблемы, наткнулся на интересный материал по теме: http://www.firststeps.ru/theory/c/ctheory1.html
0
|
|
| 05.10.2009, 14:53 | |
|
Помогаю со студенческими работами здесь
11
Работа с 2 классами и перегрузкой Работа с классами, наследованием и перегрузкой Ошибка с перегрузкой операторов Добавление и удаление объектов с перегрузкой операторов '+' и '-' Объясните работу кода с перегрузкой операторов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает
Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|