![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Абабо |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 14.1.2005 Репутация: нет Всего: 1 |
Вопрос к знатокам ANSI C++. Можно ли, не прибегая к ассемблеру, вызвать нестатический метод класса, имея лишь нетипизированный указатель (void*) на экземпляр этого класса и такой же указатель на нужный метод? Предполагается, что известен как список аргументов метода, так и тип его calling convention. Если это возможно, то как?
Заранее благодарю. ![]() --------------------
С уважением, Абабо. |
|||
|
||||
Fantasist |
|
|||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Эта информация известна на этапе написании кода или на этапе выполнения? -------------------- Волны гасят ветер... |
|||
|
||||
chipset |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
А если сделать указатель на функцию с аналогичной сигнатурой и подменить адрес на адрес твоей функции?
--------------------
|
|||
|
||||
Fantasist |
|
||||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Я к тому вопрос и задал - есть большое опасение, что такая информация известна ему только на этапе выполнения. Добавлено @ 20:43 На всякий случай, если известно, что будем вызывать:
Интересно только как адрес метода достается. Чтением виртуальной таблицы? Или как? -------------------- Волны гасят ветер... |
||||
|
|||||
chipset |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Плин, тогда придется вручную формировать класс. Вроде бы этим, хотя я не уверен, занимается такая вещь как Reflection.
Добавлено @ 20:47
Я думаю что ему по сети или ещё как-то приходит целый блок памяти скопированный с класса и указатели на мемберы. --------------------
|
||||
|
|||||
Fantasist |
|
||||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Reflection - это (не знаю откуда пошло, но похоже от Java) обзывание средств доступа к RTTI. Так как в С++ RTTI очень слабенькая, то особо там мутить нечего.
Что-то сильно сомневаюсь. -------------------- Волны гасят ветер... |
||||
|
|||||
Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Если я правильно тебя понял:
Могу обрадовать, что решение, не выходящее за рамки обычного С++ существует ![]()
Только нужно понимать, что с помощью таких преобразований можно столько всего понавызывать... Кроме того, с виртуальными функциями такой фокус может быть опасен (хотя я не уверен -- сам не проверял). -------------------- Да. Именно так. |
||||
|
|||||
Fantasist |
|
|||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Такое преобразование имеет смысл только, если перед этим было проделанно обратное преобразование (mptr к void*). Я ведь не даром поднял вопрос о том, как получается адрес метода. Дело в том, что тип CМyClass::* - не содержит адрес метода, а лишь информацию достадочную для того, чтобы его вызвать. Это сообщение отредактировал(а) Fantasist - 17.5.2005, 23:22 -------------------- Волны гасят ветер... |
|||
|
||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Fantasist
Да. Я сам не совсем понимаю как он получил этот указатель... Но на вопрос-то ответил ![]() -------------------- Да. Именно так. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |