Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
|
|||||||||||
1 | |||||||||||
Свой тип как параметр шаблона17.03.2016, 22:01. Показов 1564. Ответов 17
Метки нет Все метки)
(
Есть вопрос по коду:
![]()
0
|
|
17.03.2016, 22:01 | |
Ответы с готовыми решениями:
17
Параметр шаблона класса как собственный тип данных Как сконвертировать свой тип в тип double? Передача функции как параметр шаблона
|
Вездепух
![]() ![]() 10829 / 5848 / 1587
Регистрация: 18.10.2014
Сообщений: 14,503
|
|
17.03.2016, 22:16 | 2 |
Что такое class Base ? У вас в программе нет никакого class Base . У вас есть только шаблон class Base<> , требующий аргумента.И зачем вы пытаетесь передать class Base в тот же самый class Base в качестве параметра шаблона. В чем тут идея?"Что можно сделать" зависит от того, что вы хотите получить в результате. Тут нет телепатов. Поэтому что значит ваш загадочный код, что вы пытаетесь сделать, и что значит "что бы работало" - совершено не ясно.
1
|
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
|
||||||||||||||||||||||||||
17.03.2016, 23:21 [ТС] | 3 | |||||||||||||||||||||||||
TheCalligrapher, У меня сейчас примерно такая ситуация:
Я ищу любое решение к проблеме, не обязательно наследованием. Добавлено через 12 минут Я тут подумал, меня бы устроило такое решение:
Добавлено через 21 минуту
0
|
1389 / 1019 / 323
Регистрация: 28.07.2012
Сообщений: 2,805
|
|
17.03.2016, 23:37 | 4 |
Можешь создать себе шаблонную функцию, которая будет кастовать нужный элемент за тебя к нужному типу.
Добавь обработку ошибки преобразования типов. Нет и не советую пытаться. Получиться может, но это будет еще та фигня. Добавлено через 5 минут Мне мозолит глаза отсутствие виртуальных деструкторов. Отличный вопрос. Что у тебя за проблема?
1
|
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
|
|
17.03.2016, 23:52 [ТС] | 5 |
Согласен, идея хорошая. Но она мне в данном случае не сильно поможет.
Чем "еще та фигня" хуже другой написанной фигни? И зачем они в данном примере? Проблема в том что у некоторых унаследованных классов в векторе будет хранится только один тип данных (унаследованный от Base). С этими конкретными классами одна проблема - нужны постоянные касты к одному и тому же типу. В других унаследованных классах в этом векторе будет хранится по нескольку разных типов (унаследованных от Base). Вот я и хочу указать какие классы являются какими - что бы в первом типе классов кастовать не нужно было, а второй тип классов остался таким же. Тоже вариант.
0
|
1389 / 1019 / 323
Регистрация: 28.07.2012
Сообщений: 2,805
|
|
18.03.2016, 01:27 | 6 |
Возможные утечки памяти и ошибки доступа записи.
Утечки или вовсе ошибки при попытке удалить объект через указатель на базовый класс. dimcoder, тебе нужно продумать что ты с этим всем хочешь делать. А уже потом строить какие-то иерархии наследования с виртуальными методами. Пока мне это все видится в виде геттера в базовом классе. А где этого базового геттера будет не хватает, нужно его спрятать под private и сделать свой (который будет обращаться к базовому).
1
|
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
|
|
18.03.2016, 03:01 [ТС] | 7 |
Если вы про реаллокацию вектора при добавлении элемента, то это не проблема - можно при каждом добавлении элменента обновлять указатель. Других возможных ошибок/утечек я не вижу. Но не суть.
нету - унаследованные классы не содержат объектов (кроме вектора базового класса, который базовый класс и задестроит). Нет тут никакой потенциальной утечки. А то ![]() Это близко к тому на чем я остановился. Только прятать под private в наследованном классе толку немного - работа идет с указателями базового класса. Того у кого такой указатель есть не остановить. Но т.к. этот геттер будет использоваться только унаследованными классами, то имеет смысл спрятать его под протектед и плясать оттуда. Поэтому можно сказать, что проблема в общем-то решена. Спасибо за помощь!
0
|
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
|
|||||||||||
18.03.2016, 05:35 | 8 | ||||||||||
class BadChild: public Base<class Base<class Base<class Base<...>>>>
1
|
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
|
||||||
18.03.2016, 16:15 [ТС] | 9 | |||||
Valeryn, интересная идея, но (довольно безнадежная для меня) ошибка компиляции:
0
|
![]() 8720 / 4300 / 958
Регистрация: 15.11.2014
Сообщений: 9,744
|
|||||||||||
18.03.2016, 18:53 | 10 | ||||||||||
![]() Решение
2
|
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
|
||||||
18.03.2016, 20:09 [ТС] | 11 | |||||
hoggy,
пожалуй ваш метод мне нравится. Но с ним можно выстрелить себе в ногу: http://rextester.com/DXXKA34594
0
|
![]() 8720 / 4300 / 958
Регистрация: 15.11.2014
Сообщений: 9,744
|
|
18.03.2016, 21:51 | 12 |
у вас есть два варианта: быстрый static_cast или медленный dynamic_cast
в данной постановке задачи, других способов поиметь профит не существует в принципе.
1
|
4425 / 2364 / 853
Регистрация: 29.11.2010
Сообщений: 5,239
|
||||||
18.03.2016, 21:54 | 13 | |||||
Очень уж некорректно вы с контейнером работаете.
![]()
0
|
![]() 8720 / 4300 / 958
Регистрация: 15.11.2014
Сообщений: 9,744
|
|
18.03.2016, 22:24 | 14 |
мне одному показалось,
что getGarry должен возвращать "Garry", а не "Base"? фраза: "говорящие имена функций" - вам ни о чем не говорит?
1
|
4425 / 2364 / 853
Регистрация: 29.11.2010
Сообщений: 5,239
|
|
19.03.2016, 13:31 | 15 |
Суть(с)(тм) моего сообщения была не в имени метода, а в возвращаемом значении и том, что нельзя так с коллекциями работать. Это архитектурная ошибка.
Когда типизированый указатель помещается в более абстрактный контейнер, информация об исходном типе теряется. Если нужно её восстановить, значит не нужно было её туда класть. Ну или есть ещё множественая диспетчеризация для работы с конкретикой. Паттерн визитёт и т.п. Прямые приведения к наследнику -- выстрел себе в ногу. dimcoder, попробуйте озвучить исходную задачу. Скорее всего, то, что вы хотите сделать уже известно как делать.
0
|
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
|
|
19.03.2016, 13:47 [ТС] | 16 |
lemegeton,
Предложения по изменению архитектуры Решение - хранить два массива shared_ptr как в базовом так и унаследованном классе. Даже думаю тут достаточно иметь vector<unique_ptr> в унаследованном, а в базовом просто хранить vector<Base*>.
0
|
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
|
|||||||||||
21.03.2016, 06:27 | 17 | ||||||||||
Не пойму в чем у тебя все же за трабл.
main.cpp
test 1 i am base test 2 i am base i am good chield test 3 i am base i am base i am bad chield при том третий класс отрабатывает как надо, т.к. в вектор badchield кладется новый base, у которого отрабатывает конструктор
0
|
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
|
|
24.03.2016, 02:59 [ТС] | 18 |
Valeryn, проблема в том что при росте иерархии классов (в графе) нужно будет в классах повыше указывать все классы ниже: parent_class<Base<Base<Base<Base<Base<Base<Base<Ba se<int>>>>>>>>. Если что-то нужно поменять или добавить - меняй прототипы всех родительских классов. Брррррр...
Тем не менее, спасибо вам за ответ.
0
|
24.03.2016, 02:59 | |
Помогаю со студенческими работами здесь
18
Передать шаблонный класс, как параметр шаблона
Указатель на статический массив как параметр шаблона
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |