Форум программистов, компьютерный форум CyberForum.ru

Запустить функцию с именем из переменной - C++

Войти
Регистрация
Восстановить пароль
 
Sky-WaLkeR
1 / 1 / 0
Регистрация: 15.06.2012
Сообщений: 59
28.06.2012, 20:59     Запустить функцию с именем из переменной #1
Всем доброго времени суток!
Можно ли вызвать функцию, имя которой написано в переменной? Например, в ЯП AutoIt такая возможность есть (выглядит так: Execute("func_name(params)")).

Делаю класс меню в консоли (даже не спрашивайте зачем, просто интересно попробовать + для пары мелких утилит пригодится), и хочу сделать универсальным - при инициализации класса указываешь элементы, цвета etc, и функции, вызываемые при нажатии на enter. Сейчас приходится писать через switch в одной функции - универсальностью и не пахнет...
Как-то так в идеале...
C++
1
2
string func_name="my_function(a,b)";// тип не важен, хоть char, сам факт
%какая_то_функция%(func_name);// искомое...
P.S: Sorry за не очень удачное название, не смог лучше придумать...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2012, 20:59     Запустить функцию с именем из переменной
Посмотрите здесь:

Реализовать внешнюю функцию с именем make_mun() C++
Инициализация переменной во время выполнения с именем, заданным пользователем C++
Можно ли запустить отдельным потоком функцию-член класса? C++
Ошибка в значении переменной, передаваемой в функцию C++
Определить тип передаваемой в функцию переменной C++
Создание файла с именем, которое указано в переменной C++
C++ Объявление целочисленной переменной с именем var_i
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 21:03     Запустить функцию с именем из переменной #2
Sky-WaLkeR, напрямую, насколько я знаю, нельзя.
Попробуй разбирать функцию на имя и аргументы. В зависимости от имени вызвать определенную ф-цию и передать аргументы
Sky-WaLkeR
1 / 1 / 0
Регистрация: 15.06.2012
Сообщений: 59
28.06.2012, 21:05  [ТС]     Запустить функцию с именем из переменной #3
Жаль... То есть придется писать все в одной функции и делать switch на аргументы?
P.S: Спасибо за быстрый ответ.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 21:19     Запустить функцию с именем из переменной #4
Sky-WaLkeR, функция записывается так:

<возвращаемый тип> <имя>(<arg0>, <arg1>, ..., <argN>);

запихиваешь в стринг (там разбирать проще)
После раскидываешь все по переменным string name, arg[0..N]

потом делаешь сравнение
C++
1
2
3
4
if(name == "func")
{
    func(arg[0], arg[1]);
}

ну как-то так
Sky-WaLkeR
1 / 1 / 0
Регистрация: 15.06.2012
Сообщений: 59
28.06.2012, 21:34  [ТС]     Запустить функцию с именем из переменной #5
Это не совсем то...
Заранее название функции я не знаю (может быть любое...).
При нажатии на Enter вызывается метод enter. Я хочу, чтобы можно было изменять для каждого меню этот метод на свою функцию. Мне это нужно для большей универсальности - в конструкторе указал функцию, и уже в ней работаешь. (потом может вынесу в отдельные файлы... а-ля мини-библиотека)
Например, система вложенного меню: при вызове первого пункта первого меню открыть новое, при вызове первого пункта нового меню - выход. Писать обработку в методе - вся универсальность теряется (хотя пока так и делаю: создал в классе переменную id и конструктором изменяю - в первом на 1, во втором на 2, и с помощью switch в enter ставлю действия, но это глупо и неудобно).
Хочется что-то наподобие слотов в Qt.
Пример как я сейчас делаю (все лишнее убрал):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cMenu::enter(short id){
    switch(id){
        case 1: //обработка действий для первого меню
            switch(choice){
                case 1: // обработка для первого пункта
            }
        case 2: для второго
            switch(choice){
                case 1: // обработка для первого пункта
            }
    }    
}
 
cMenu menu1(1, остальные параметры - цвета, префиксы etc);
...
cMenu menu2(2, ...);
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 21:37     Запустить функцию с именем из переменной #6
Sky-WaLkeR, создай класс Menu и наследуй его. Перегружай функции
Venzo
 Аватар для Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
28.06.2012, 21:47     Запустить функцию с именем из переменной #7
попробуйте atexit, только там вызывается функция по указателю
Sky-WaLkeR
1 / 1 / 0
Регистрация: 15.06.2012
Сообщений: 59
28.06.2012, 21:51  [ТС]     Запустить функцию с именем из переменной #8
Цитата Сообщение от ZoRT Посмотреть сообщение
atexit
Вот, это уже ближе... Никак нельзя заставить ее принимать имя функции из переменной? (параметры передавать мне и не надо в принципе....)
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 22:02     Запустить функцию с именем из переменной #9
Sky-WaLkeR, ты можешь создать void* и указать на функцию. Но это забивание гвоздей микроскопом. Твоя задача решается наследованием классов
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
28.06.2012, 22:09     Запустить функцию с именем из переменной #10
ZoRT, все что делает atexit, это просто устанавливает функции, которые будут вызываться по окончанию работы программы.

Sky-WaLkeR, ваша задача методами с++ не решаема.
Как вариант делайте контейнер, в него пихайте указатели на функции и потом вызывайте их когда заходите.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2012, 12:25     Запустить функцию с именем из переменной
Еще ссылки по теме:

Передача переменной из функции в функцию C++
C++ Передача переменной в функцию
Автоматическое создание переменной с определённым именем в цикле C++
C++ Передача переменной в лямбда-функцию по значению
C++ Как создать функцию изменяющую значение переменной?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Sky-WaLkeR
1 / 1 / 0
Регистрация: 15.06.2012
Сообщений: 59
29.06.2012, 12:25  [ТС]     Запустить функцию с именем из переменной #11
Всем спасибо за ответы.
Ksan, я не совсем понимаю, про какое наследование классов ты говоришь. Класс-то у меня один...
Микроскоп у меня старый, тяжелый и не очень сильный (~630x, инфузория-туфелька видна хорошо), поэтому решил своим способом: убрал весь класс в отдельный файл, вывел описание (или как там оно называется...) метода enter, и каждому меню присваиваю числовой id, а в enter switch'ем их проверяю... Не очень, конечно, но работает.
Я Си++ недавно изучаю, чуть меньше 20дней, так что сильно не пинайте...
Yandex
Объявления
29.06.2012, 12:25     Запустить функцию с именем из переменной
Ответ Создать тему
Опции темы

Текущее время: 01:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru