|
Заблокирован
|
|||||||||||||||||||||
Полиморфизм и доступ к полям потомков17.02.2015, 23:04. Показов 4980. Ответов 21
Метки нет (Все метки)
Задача: накидать в окне прямоугольники и круги, а потом упаковать их максимально плотно. Делаем в Qt. Структура классов такая: есть базовый класс Shape, и от него наследуются классы прямоугольников Rect и кругов Circle.
Код:
Как это исправить? И почему наследование надо обязательно делать public, иначе возникает ошибка?
0
|
|||||||||||||||||||||
| 17.02.2015, 23:04 | |
|
Ответы с готовыми решениями:
21
Выведите номера вершин, у которых количество потомков в левом поддереве не равно количеству потомков в правом Доступ к полям Доступ к полям класса |
|
Заблокирован
|
|
| 17.02.2015, 23:40 [ТС] | |
|
Он понадобится в будущем, когда будем реализовывать свой собственный механизм отрисовки у каждого класса-наследника, а в Shape будут виртуальные функции.
Добавлено через 2 минуты Но у класса Rect есть ведь эта переменная. Почему я не могу к ней обратиться? Ведь в векторе находятся по сути экземпляры класса Rect, а то, что вектор хранит Shape'ы, так что в этом плохого?
0
|
|
|
28 / 28 / 5
Регистрация: 23.04.2014
Сообщений: 130
|
||||||
| 17.02.2015, 23:57 | ||||||
|
Eru Iluvatar, во-первых, тут налицо попытка обратиться из внешнего кода к приватным данным. Не прокатит.
А во-вторых, ты можешь обращаться к потомкам через указатель на базовый класс. Чтобы это можно было делать, наследование должно быть public. В случае protected или private наследования внешний код "не видит" отношения наследования между этими классами и поэтому не позволит привести указатель на объект класса-наследника к указателю на объект класса-родителя. Поэтому вектор лучше создать из указателей на Shape. Я бы вообще использовал здесь шаблон Visitor, т.к. будет много однотипных действий над объектами разных классов-наследников от одного базового класса. Пример обращения к наследнику через указатель:
P.S. вообще ООП-наследование реализуется именно через public-наследование, а другие виды - это просто фишка C++. Чтобы не париться, постоянно указывая public, используй структуру вместо класса. Она по умолчанию наследуется с модификатором public.
0
|
||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||
| 17.02.2015, 23:57 | ||||||||
1
|
||||||||
|
Заблокирован
|
|||||||||||
| 18.02.2015, 00:17 [ТС] | |||||||||||
|
В первый раз вижу, что структуры можно наследовать как классы и определять в них конструкторы и деструкторы.
Сделал такие изменения в своих классах, и получил ошибку: invalid abstract return type for member function 'Shape Vector::operator[](int)' Хедер вектора:
0
|
|||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||||||||||
| 18.02.2015, 00:43 | |||||||||||||||||||||||
|
В остальном принципиальной разницы нету. Во многих случаях struct экономит буковки (не нужно каждый раз вручную писать public). И поскольку я не люблю писать код, если с таким же успехом его можно не писать, то предпочитаю использовать struct, а не class.
Каждый раз, когда вы пытаетесь его запустить, он делает вам копию. Вы уверены, что это именно то, что вам нужно? Потому что обычно контейнеры не делают лишних копий. Они возвращают ссылки на свои элементы:
грамотные люди для хранения индексов или размеров используют беззнаковый тип данных size_t, а вовсе не знаковый int. Кроме того, хороший ход так же реализовать метод доступа к элементам контейнера в условиях, когда сам контейнер константный:
0
|
|||||||||||||||||||||||
|
Комп_Оратор)
|
||||||
| 18.02.2015, 00:51 | ||||||
|
Eru Iluvatar, я не увидел не единого виртуального метода.
0
|
||||||
|
Заблокирован
|
||||||||||||||||
| 18.02.2015, 01:00 [ТС] | ||||||||||||||||
|
У меня сейчас классы написаны так:
Из-за чего это? Я ведь вроде бы реализовал все виртуальные методы.
0
|
||||||||||||||||
|
28 / 28 / 5
Регистрация: 23.04.2014
Сообщений: 130
|
|
| 18.02.2015, 01:08 | |
|
Eru Iluvatar, в определении класса объяви метод draw без "= 0"
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||
| 18.02.2015, 01:08 | |||||||||||||
0
|
|||||||||||||
|
28 / 28 / 5
Регистрация: 23.04.2014
Сообщений: 130
|
||
| 18.02.2015, 01:10 | ||
|
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 18.02.2015, 01:11 | |||
|
Ему не поможет - будет ошибка линкера, который не сможет найти определение метода. К тому же, если наследник не реализует интерфейс, то такой наследник все равно не сможет работать так, как это задумывается по задаче. Добавлено через 54 секунды Таковы правила. Иначе - компилятор обидится, и отругает ошибками.
0
|
|||
|
28 / 28 / 5
Регистрация: 23.04.2014
Сообщений: 130
|
|||
| 18.02.2015, 01:12 | |||
|
Добавлено через 44 секунды
0
|
|||
|
Заблокирован
|
|||||||
| 18.02.2015, 01:15 [ТС] | |||||||
Насчет декларации виртуального метода я думал, что это не обязательно, потому что он и так наследуется от базового класса. Когда я сделал все эти изменения, возникла еще куча ошибок, но уже в классе вектор: там попытка создать экземпляр виртуального класса, и я даже не знаю, как теперь изменить всю логику этого класса, которая неплохо работала до того, как этот класс стал абстрактным.
0
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||
| 18.02.2015, 01:15 | ||||
|
ключевое слово virtual должно быть опущено. У ТС ошибка компилятора, а не линкера. До линкера дело вообще не дошло. А компилятор ругается, из-за того, что в классе отсутствует декларация прототипа функции-члена. Определение у него есть. А вот объявления нету.
0
|
||||
|
Заблокирован
|
||||||
| 18.02.2015, 01:17 [ТС] | ||||||
|
Ошибка в строке
0
|
||||||
|
28 / 28 / 5
Регистрация: 23.04.2014
Сообщений: 130
|
|
| 18.02.2015, 01:19 | |
|
hoggy, по-моему, Вы меня неправильно поняли. У автора в базовом классе объявлен абстрактный метод, а в наследнике нет его объявления без "= 0", т.е. он остаётся абстрактным. Нужно не только добавить определение, но и объявить метод не абстрактным. Я это хотел сказать
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||
| 18.02.2015, 01:21 | ||||||||
|
1. Нельзя возвращать ссылку на временный объект. 2. Нельзя цеплять временные объекты по ссылкам на изменяемые объекты.
В наследнике нолик указывать не нужно.
0
|
||||||||
|
Заблокирован
|
||||||
| 18.02.2015, 01:24 [ТС] | ||||||
|
'out_of_range' is not a member of 'std'
Теперь та же самая ошибка создания объекта при создании массивов, как здесь:
0
|
||||||
| 18.02.2015, 01:24 | |
|
Помогаю со студенческими работами здесь
20
Доступ к полям datagridview Доступ к protected полям Доступ к полям формы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Рецензия / Мнение
Это мой обзор планшета X220 с точки зрения школьника.
Недавно я решила попытаться уменьшить свой. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|