Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
|
|||||||||||
1 | |||||||||||
Свой тип как параметр шаблона17.03.2016, 22:01. Показов 1661. Ответов 17
Метки нет (Все метки)
Есть вопрос по коду:
0
|
17.03.2016, 22:01 | |
Ответы с готовыми решениями:
17
Параметр шаблона класса как собственный тип данных Как сконвертировать свой тип в тип double? Передача функции как параметр шаблона Шаблоннный клас как параметр шаблона |
Вездепух
11697 / 6376 / 1724
Регистрация: 18.10.2014
Сообщений: 16,082
|
|
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
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
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
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
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
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||
18.03.2016, 18:53 | 10 | ||||||||||
Сообщение было отмечено dimcoder как решение
Решение
2
|
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
|
||||||
18.03.2016, 20:09 [ТС] | 11 | |||||
hoggy,
пожалуй ваш метод мне нравится. Но с ним можно выстрелить себе в ногу: http://rextester.com/DXXKA34594
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
18.03.2016, 21:51 | 12 |
у вас есть два варианта: быстрый static_cast или медленный dynamic_cast
в данной постановке задачи, других способов поиметь профит не существует в принципе.
1
|
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,596
|
||||||
18.03.2016, 21:54 | 13 | |||||
Очень уж некорректно вы с контейнером работаете.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
18.03.2016, 22:24 | 14 |
мне одному показалось,
что getGarry должен возвращать "Garry", а не "Base"? фраза: "говорящие имена функций" - вам ни о чем не говорит?
1
|
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,596
|
|
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<Base<int>>>>>>>>. Если что-то нужно поменять или добавить - меняй прототипы всех родительских классов. Брррррр...
Тем не менее, спасибо вам за ответ.
0
|
24.03.2016, 02:59 | |
24.03.2016, 02:59 | |
Помогаю со студенческими работами здесь
18
Передать шаблонный класс, как параметр шаблона Результат работы функции как параметр шаблона Указатель на статический массив как параметр шаблона Как можно изменить параметр шаблона (template)? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |