![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
нет в том, что объектом не является не только инстанция класса, но и сам класс.. какими возможностями будет обладать объект-класс зависит от идеологии.. в рантайме мы можем создать только безличностный объект, а dynamic_cast показываеткак привести к нужному интерфейсу Добавлено через 1 минуту и 39 секунд мой пример был приведен не по теме, а как ответ на Добавлено через 5 минут и 37 секунд если ближе к теме, то кусок должен выглядить так :
Добавлено через 7 минут и 50 секунд P.S. и вместо type по смыслу больше подходит Class.. |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
все равно не понял.. можете как-то псевдокодом показать пример того как это дело можно использовать... и для чего? ;) Добавлено через 3 минуты и 52 секунды я не понимаю я этого, наверное потому что никогда не писал на ЯП которые это умеют делать |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Вешать сюда. По AST со входа нужно генерить таблицы с расширенным RTTI (RTTIEx), и специальный сегмент для общей таблицы с именами типов и ссылками на RTTIEx для каждого типа. Это вторая часть reflection - специальная библиотека. Этот Class использует таблицы RTTIEx для выдачи энумераторов на все member'ы класса. Каждый экземпляр Class описывает один конкретный тип Кроме энумераторов Class должен содержать функции для чтения/записи/вызова member'ов исходного класса и функцию для создания этих самых исходных классов. Конкретные интерфейсы написать прямо тут затрудняюсь - их слишком много |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
тут type - какой-то базовый тип? т.е. таким образом мы можем получить объект базового типа который умеет создавать объекты типа "A" ? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
таким образом мы получаем объект (объект-тип), который знает "все" о классе типа "А" , а также может создатьинстанцию этого класса.. P.S. к базовым классам типа A отношение не имеет, это отдельная линия.. |
|||
|
||||
| boostcoder |
|
||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
но в таком случае, дополнительный код будет генериться для всех классовых типов. разве это нужно? я представлял что прогер сам помечает класс при помощи прагм или атрибутов. и для этих типов и будет генериться все необходимое..
очень желательно это объяснить в боооолее развернутой форме. ибо я никогда не разрабатывал/модифицировал компиляторы. и мне еще многое не понятно с этим понятно. вроде...
тоже понятно...
чьи интерфейсы? |
||||||
|
|||||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Добавлено @ 11:22 вот еще пример
Это сообщение отредактировал(а) mes - 26.7.2011, 11:48 |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
mes, минутку... это нужно переварить..
Это сообщение отредактировал(а) boostcoder - 26.7.2011, 13:17 |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
к примеру, если имя типа/объекта известны во время компиляции в виде строки, то как создать объект или получить ссылку на существующий объект - понятно.
тут все просто. но для того чтоб интроспекция была динамической, нам нужно уметь выполнять все тоже самое но в рантайме... а для этого кодогенерация в компайлтайме не подходит... т.е., все классовые типы должны наследовать базовый тип Class, к примеру...
Это сообщение отредактировал(а) boostcoder - 26.7.2011, 13:24 |
||||
|
|||||
| boostcoder |
|
||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
т.е. к примеру такая программа:
должна быть оттранслирована в нечто типа этого:
правильно? еще не понятно, как быть с объектами... create и invoke должны возвращать указатели? и еще, будет ли такой код считаться логичным, и нужно ли оно вообще?
Это сообщение отредактировал(а) boostcoder - 26.7.2011, 18:07 |
||||||
|
|||||||
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
Чтобы это сделать, нужно при компиляции сгенерировать код, который для каждого класса в программе при ее запуске создаст объект типа Class (или type_info или как-нибуть еще) и положит его в какую-нибудь коллекцию (например в Java этим занимается ClassLoader виртуальной машины), чтобы можно было потом его в это коллекции найти, извлечь и использовать... Классы в программе не должны наследоваться от класса Class, для каждого класса должен быть создан объект класса Class, но желательно иметь что-то типа класса Object, от которого они бы наследовались... Ну или как-то так... З.Ы. Все это взято мной из воспоминаний о том, как работает reflection в Java... -------------------- ![]() |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
т.е. получается, что все объекты типа Class ссылаются на какую-то глобальную карту. и данные для этой карты нужно генерировать в компайлтайм. а инициализировать в рантайм? правильно мыслю?
Добавлено через 1 минуту и 36 секунд kosmonaFFFt, можешь показать тоже самое в коде? или в псевдокоде. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
все объекты, как принимаемые аргументы, так и возвращаемые, в том числе Void являются наследником Object.. просьба не путать типы Object и Class.. если первый является базой для всех полиморфных типов, то второй метаинформация о классе.. т.е. Class это такой объект с помощью которого можно создать наследника Object.. Добавлено через 2 минуты и 14 секунд я приводил примеры по динамическому, потому как в статике и так все типы известны и никаких доп. ухищрений не надо.. |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
о! понял mes, а по остальным вопросам что-нибудь ответите? ;) Добавлено через 1 минуту и 14 секунд еще нужно решить что нужно в интерфейсах Class и Object... и этот момент мне все еще не понятен -
|
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
все принимают и возвращают объекты, а Void :
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |