3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
|
||||||
1 | ||||||
Как вернуть обьект тип которого заранее неизвестно14.02.2012, 23:56. Показов 3196. Ответов 33
Метки нет (Все метки)
решил поучить паттерны, застрял малость на одном, а точнее на его реализации, паттер называеться Вариант, смысл его, убрать типизацию...
понятно что мы создаем функцию которая возвращает обьект, но мы ж незнаем тип обьект...
0
|
14.02.2012, 23:56 | |
Ответы с готовыми решениями:
33
Ввод текста, число строк которого заранее неизвестно Ввести массив целых чисел, количество элементов которого заранее неизвестно Как обрезать строку? значение переменной MyStr заранее неизвестно. Как вставить ряд данных, если заранее неизвестно сколько будет значений ? |
Заблокирован
|
|
15.02.2012, 23:20 | 21 |
объекты ты же могут потрогать статик-мемберы своего класса. Что им мешает потрогать статик-мембер указатель на таблицу вирт?
Тем более под чутким руководством компилятора. Зачем одну и ту же информацию, известную на стадии компиляции дублировать во всех объектах класса?
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
15.02.2012, 23:20 | 22 |
когда в рантайме у объекта по указателю, приведенному к базовому типу, вызывается виртуальная функция, то неизвестно какого типа этот объект и от какого класса нужно брать статический указатель на vtable
поэтому естественно указатель на vtable носится каждым объектом
1
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
||||||
15.02.2012, 23:22 | 23 | |||||
с каких пор компилятор может знать тип полиморфного объекта в рантайме?
даже для кода
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
15.02.2012, 23:26 | 25 |
typeid для классов с виртуальными функциями работает примерно так же как и подбор правильной виртуальной функции. возможно указатель на правильный тайпайди находится в таблице виртуальных функций и компилятор в случае, когда тайпайди вызывается для указателя или ссылки такого вот класса, вставляет код, который шарится по таблице и ищет правильный тайпайди.
0
|
Заблокирован
|
|
15.02.2012, 23:35 | 26 |
Ну как бы там ни было, а теоретически, компилятор в состоянии такую информацию проконтролировать. Причем без ущерба производительности (по крайней мере в сравнении с издержками на поддержку виртуального полиморфизма).
Я искал информацию. Нашел какую то запись у Страуструпа, где он сообщал, что технически подобная возможность заложена в компиляторы, но не предоставлена в пользование самим программистам, просто потому, что это противоречит духу с++, и что бы программисты на с++ этой возможностью не злоупотребляли. В итоге, на с++ невозможно сделать красивую рантайм идентификацию типов. И приходится городить огород из всяких фабрик. А если и есть какая более менее полноценная рантайм идентификация - только исключительно в качестве расширения отдельных компиляторов. И с typeof такая же история.
0
|
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
|
|
15.02.2012, 23:52 [ТС] | 27 |
Ребята вопрос вначале темы совсем не об этом был
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
15.02.2012, 23:55 | 28 |
почитайте как устроет boost::variant или boost::any
может навет на какие-нибудь мысли.
0
|
Заблокирован
|
||||||
15.02.2012, 23:59 | 29 | |||||
Да никак. В рантайме вычислить фактический тип объекта невозможно.
Можно: 1. Хардкорно ручками прописать приведение типа к нужному тебе типу. 2. Юзать виртуальный полиморфизм. Но тогда сам по себе контейнер variant абсолютно бесполезен. С таким же успехом можно просто держать указатель на базовый класс. Сам по себе паттерн для с++ бесполезный. И весь твой код, описанный в сабже я могу сократить без потери смысла до:
зы: пока к с++ не приделают нормальную рантайм идентификацию, которой можно было бы красиво пользоваться, все эти variant и any - как рыбке зонтик.
1
|
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
|
|
16.02.2012, 00:02 [ТС] | 30 |
0
|
Заблокирован
|
||||||
16.02.2012, 00:07 | 31 | |||||
Можно вычислить тип не_полиморфного объекта, при условии, что тип объекта прошёл процедуру регистрации. Регистрация осуществляется времени компиляции. (поэтому в рантайме потерь производительности практически не будет).
Метод костыльный. Своего рода кривоватый аналог typeof который не умеет работать с полиморфными объектами. то есть можно написать так:
0
|
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
|
|
16.02.2012, 00:17 [ТС] | 32 |
можете объяснить что такое полиморфный объект?
0
|
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
|
|
16.02.2012, 00:28 [ТС] | 34 |
понятно)
0
|
16.02.2012, 00:28 | |
16.02.2012, 00:28 | |
Помогаю со студенческими работами здесь
34
Как выгрузить из ресурсов текстовый файл, если имя его заранее неизвестно ? Как определить тип переменной, ссылающейся на определённый класс? Нужен именно тип, а не ссылка на обьект! Разработать класс, обьект которого реализует "пользовательский" тип данных Как возможно вернуть из функции обьект? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |