Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамический вызов методов 
:(
    Опции темы
Тигер
Дата 19.4.2010, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



надоело писать често такое
Код

switch(methods[method]){
        case MPP:
            Method::MPP();
            break;
     case MLP:
         Method::MLP();
         break;
     case MT:
         Method::MT();
         break;
        case MP:
         Method::MP();
         break;
     case MCP:
         Method::MCP();
         break;
        default:
            Error("Method '%s' not defined",method.c_str());
            return;
        }

нельзя ли как нибудь динамически вызвать нужный метод?

ещё вопрос, нельзя ли как-нибудь работать со свичём без enum? напрямую со значениями
PM MAIL   Вверх
kemiisto
Дата 19.4.2010, 19:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(Тигер @  19.4.2010,  20:56 Найти цитируемый пост)
надоело писать често такое

А смысл какой у такой конструкции?


--------------------
PM MAIL WWW GTalk Jabber   Вверх
azesmcar
Дата 19.4.2010, 20:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Тигер

map + указатель на функцию.
PM   Вверх
toxx
Дата 19.4.2010, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



А может быть имеется в виду чтото такое?
Код

Method *pMethod=new  Method;
pMethod->MPP();
....



Это сообщение отредактировал(а) toxx - 19.4.2010, 20:17
PM MAIL   Вверх
azesmcar
Дата 19.4.2010, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(toxx @  19.4.2010,  20:16 Найти цитируемый пост)
А может быть имеется в виду чтото такое?

Фабрика команд, более усложненный случай map+указателя на функцию.
PM   Вверх
ИванМ
Дата 19.4.2010, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Если константы идут подряд можно вместо map'а использовать обычный массив.
PM MAIL   Вверх
azesmcar
Дата 19.4.2010, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(ИванМ @  19.4.2010,  20:39 Найти цитируемый пост)
Если константы идут подряд можно вместо map'а использовать обычный массив. 

можно даже если не идут, тут вопрос что важнее. Если к примеру ключ умещается в short то вполне реально создать массив размером в 65536 элементов, но взамен получить константную сложность поиска. Я так делал в одной низкоуровневой библиотеке, прирост был фантастический на аппарате с процессором 70mhz.
PM   Вверх
Тигер
Дата 19.4.2010, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



azesmcar
дык эмм. эту карту сначало заполнить надо.
вообщем, как реализуются паттерны фабрика или serviceLocator в с++

Это сообщение отредактировал(а) Тигер - 19.4.2010, 22:10
PM MAIL   Вверх
azesmcar
Дата 19.4.2010, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Тигер @  19.4.2010,  22:08 Найти цитируемый пост)
дык эмм. эту карту сначало заполнить надо.

 smile ничего не поделаешь, не умеет C++ угадывать что нужно пользователю smile 

Цитата(Тигер @  19.4.2010,  22:08 Найти цитируемый пост)
как реализуются паттерны фабрика 

http://forum.vingrad.ru/forum/topic-266893...tml#st_0_view_0
PM   Вверх
Тигер
Дата 19.4.2010, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



ну тоже через map
а нет какой-нибудь функции каторая проверит существует ли метод в классе?

Добавлено через 3 минуты и 2 секунды
гуглил гуглил. из подтекста виднелось что это можно сделать при помощи dll?
заодно и динамическую подгрузку модулей?
PM MAIL   Вверх
azesmcar
Дата 19.4.2010, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Тигер @  19.4.2010,  22:23 Найти цитируемый пост)
а нет какой-нибудь функции каторая проверит существует ли метод в классе? 

нет, в run-time эта информация недоступна.
PM   Вверх
azesmcar
Дата 20.4.2010, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Тигер @  19.4.2010,  22:23 Найти цитируемый пост)
гуглил гуглил. из подтекста виднелось что это можно сделать при помощи dll?

В DLL можно smile через GetProcAddress.
PM   Вверх
GoldFinch
Дата 20.4.2010, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



пример "саморегистрирующийся" фабрики есть у Александреску в "Современном проектировании"

выглядит это примерно так
Код

bool UNIQUE_NAME = register_method_in_map(globalMethodsMap, &method);
R method(T1 arg1, ...)
{
   .....
}


регистрацию метода в карте можно завернуть в макрос.

более полный пример 
http://forum.vingrad.ru/forum/topic-273518...atch/index.html
(пункт 2)

Добавлено через 1 минуту и 19 секунд
также, методы можно сделать виртуальными, и использовать какой-нибудь хак с таблицей виртуальных методов
PM MAIL ICQ   Вверх
Owen
Дата 20.4.2010, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 5.7.2006
Где: Русь

Репутация: нет
Всего: нет



А чем не подходит передавать указатель на функцию/метод?

Код

class Test
{
public:
  void Foo( )
  {
  }
};

Test* var;

void Func( void(Test::*func)() )
{
  (var->*func)( );
}

int main( )
{
  var = new Test( );
  Func( &Test::Foo );
  return 0;
}

PM ICQ   Вверх
djamshud
Дата 20.4.2010, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



Из текущей программы или динамически слинкованной библиотеки можно получить (и проверить на существование) функцию по string-имени. В POSIX.1-2001 это dlopen, dlsym и т.д., в винде какие-то winAPI-шные аналоги, кроме того на гуглокоде есть реализация dl-интерфейса под винду. Вытаскиваемая функция должна быть экспортируемой extern "C", с++-ные методы так не вытащить.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0708 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.