3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
|
||||||
1 | ||||||
Как вернуть обьект тип которого заранее неизвестно14.02.2012, 23:56. Показов 3192. Ответов 33
Метки нет (Все метки)
решил поучить паттерны, застрял малость на одном, а точнее на его реализации, паттер называеться Вариант, смысл его, убрать типизацию...
понятно что мы создаем функцию которая возвращает обьект, но мы ж незнаем тип обьект...
0
|
14.02.2012, 23:56 | |
Ответы с готовыми решениями:
33
Ввод текста, число строк которого заранее неизвестно Ввести массив целых чисел, количество элементов которого заранее неизвестно Как обрезать строку? значение переменной MyStr заранее неизвестно. Как вставить ряд данных, если заранее неизвестно сколько будет значений ? |
4768 / 2578 / 892
Регистрация: 29.11.2010
Сообщений: 5,575
|
|
15.02.2012, 09:05 | 2 |
Недостаток паттерна variant в том, что никак не проверить, что же он, собственно, содержит, а в самом С++ нет механизмов рефлексии.
Поэтому либо перебором, либо храните в нем только такие данные, тип которых по-настоящему не имеет значения.
1
|
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
|
|
15.02.2012, 12:41 [ТС] | 4 |
Странно но у меня все нормально компилиться(10 визуал)
Добавлено через 2 минуты блин, так я не пойму смысла с этого паттерна, если мы только может вытянуть данные таким способом (Variant v(4); int a = v тоесть мы заранее знаем что там находиться... толк от этого?
0
|
Заблокирован
|
|
15.02.2012, 14:35 | 5 |
Я сколько ни пытался, мне так и не удалось идентифицировать тип объекта, по самому объекту.
За исключением костыльной техники typeof (она требует, что бы тип объекта предварительно прошёл регистрацию, времени компиляции. И не умеет идентифицировать фактический тип полиморфного объекта). Сколько ни пытался, так и не удалось извлечь на свет божий фактический тип полиморфного объекта. Более того, полагаю, что на языке статической типизации подобное совершить просто невозможно. Может быть есть какое то.. полухакерское решение... Нельзя по указателю на базовый тип толкнуть не_виртуальный метод потомка.
0
|
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
|
|
15.02.2012, 19:15 [ТС] | 6 |
Обьясните что вы тут хотели сказать я то я просто еще не очень понимаю.
в Яве я видел нетепизировыне контейнеры.... значить все же можно по идеи реализовать и тут. Не по теме: Вот я не пойму почему когда указателю базового класса присвоить адрес класса наследника то в таблице виртуальных методов только изменит адрес того метода который переопределяеться в потомке, а виртуальные методы обьявленые в потомке невидны
0
|
Заблокирован
|
|
15.02.2012, 19:27 | 7 |
1. Когда указателю на базовый класс присваивается адрес потомка, то этот указатель тупо начинает смотреть на область памяти, где живет объект-потомок.
Никаких изменений ни в каких таблицах виртуальных функций не происходит. 2. Виртуальные методы базового класса, переопределенные в потомке, видны. И их можно запустить.
0
|
retmas
|
15.02.2012, 19:36
#8
|
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
15.02.2012, 20:21 | 9 |
Насколько мне известно, в джаве нетипизированные контейнеры на самом деле вполне себе типизированные и используют в качестве типа элементов тип Object. Идеология языка предполагает однокорневую иерархию и все классы прямо или косвенно являются потомками класса Object, поэтому любой объект можно положить по ссылке типа Object.
1
|
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
|
|
15.02.2012, 21:11 [ТС] | 10 |
Кстати да, я забыл что все наследуются от object)
Добавлено через 37 секунд не понял Вас Добавлено через 6 минут или вы себе противоречите или я не понимаю. Сами сказали что при присвоению указателю на базовый класс присваивается адрес потомка, то этот указатель смотрит на область памяти где живет обькет-потом, ну так если он туда указывает почем не видно виртуальных функций которые обявлены в классе-потомке?
0
|
Заблокирован
|
||||||
15.02.2012, 21:18 | 11 | |||||
1. Где ты нашел противоречия?
2. Фраза "методы видны, и их можно запустить" ты прочел как "методы не видны, и их нельзя запустить" да?
0
|
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
|
||||||
15.02.2012, 21:50 [ТС] | 12 | |||||
0
|
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
|
|
15.02.2012, 22:55 [ТС] | 14 |
В том же и прикол когда я спрашивал сначала Вы меня походу не так поняли или может я не так вопрос задал. На сколько я понимаю когда в классе есть хоты бы одна виртуальная функция то компилятор в классе ставит "невидимый" указатель на таблицу виртуальных методов.( функция - адрес)
Виртуальные методы нужны если нужно изменить поведение функции в классе потомке. Для каждого класса только 1 таблица. когда мы создаем объект класса наследника получается что вызывается конструктор базового класса в нем инициализуруется указатель на таблицу, а потом уже конструктор наследника в котором замещается адрес виртуальных методов. Если я неправ поправьте меня
0
|
Заблокирован
|
|
15.02.2012, 23:04 | 15 |
На самом деле "невидимый" указатель на таблицу виртуальных функций присутствует не в "классе", а в "объектах" этого класса. И честно говоря, я не в полне себе понимаю, почему так было сделано.
Ведь этот указатель у всех объектов одного класса один и тот же. По мне так, тут статик мембер просится. Ну да не суть. Вот здесь можно узнать про "низкоуровневую" кухню. Доступно описано: http://www.devdoc.ru/index.php... l_base.htm
0
|
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
|
|
15.02.2012, 23:09 [ТС] | 16 |
Оо, за ссылку спасибо щас почитаю) но на мой вопрос так никто и не ответил(
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
15.02.2012, 23:13 | 17 |
HardMorg, а какой вопрос-то? Почему код не компилируется? Да потому, что у вас базовый класс содержит таблицу виртуальных функций всего лишь с одной записью, а производный - с двумя. Базовый класс ничего не знает о том, что было добавлено в производном, соответственно, к этим изменениям мы не можем достучаться и через указатель на базовый класс.
0
|
Заблокирован
|
||||||
15.02.2012, 23:13 | 18 | |||||
IBase* ptr = new Concrete(); //По идее, тут запускается конструктор именно потомка, а не предка.
Однако, по правилу наследования, конструктор потомка запустит конструктор предка. Причем, туловище конструктора предка будет запущено прежде, чем туловище конструктора потомка:
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
15.02.2012, 23:19 | 19 |
0
|
4768 / 2578 / 892
Регистрация: 29.11.2010
Сообщений: 5,575
|
||||||
15.02.2012, 23:19 | 20 | |||||
Переменная может вдруг изменить свой тип (приведение не дремлет), а для консистенции надо, чтобы виртуальные функции правильно вызывались. Если бы в самой переменной не было бы виртуальной таблицы, приведением можно было бы вызывать функции любых классов.
Пример.
0
|
15.02.2012, 23:19 | |
15.02.2012, 23:19 | |
Помогаю со студенческими работами здесь
20
Как выгрузить из ресурсов текстовый файл, если имя его заранее неизвестно ? Как определить тип переменной, ссылающейся на определённый класс? Нужен именно тип, а не ссылка на обьект! Разработать класс, обьект которого реализует "пользовательский" тип данных Как возможно вернуть из функции обьект? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |