С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Sky-WaLkeR
1 / 1 / 0
Регистрация: 15.06.2012
Сообщений: 59
#1

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

28.06.2012, 20:59. Просмотров 852. Ответов 10
Метки нет (Все метки)

Всем доброго времени суток!
Можно ли вызвать функцию, имя которой написано в переменной? Например, в ЯП AutoIt такая возможность есть (выглядит так: Execute("func_name(params)")).

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

Объявление целочисленной переменной с именем var_i - C++
Требуется написать объявление целочисленной переменной с именем var_i

Создание файла с именем, которое указано в переменной - C++
Здравствуйте! Возможно ли создать файл с именем, которое указано в переменой например nazv Если да, покажите пример

Автоматическое создание переменной с определённым именем в цикле - C++
Например, нужно чтобы с каждым шагом цикла, создавалась переменная a1, a2, a3 и так далее

Инициализация переменной во время выполнения с именем, заданным пользователем - C++
Вопрос - возможно ли инициализировать переменную с именем заданным пользователем? то есть допустим из txt файла считался текст "int...

Создание папки с именем, которое находится в переменной типа string - C++
Нужно программно создать папку с именем, которое находится в переменной типа string Пытаюсь сделать так string ident("name");...

Реализовать внешнюю функцию с именем make_mun() - C++
Структурой-парой называется структура с двумя полями, которые обычно имеют имена first и second. Требуется реализовать тип данных с помощью...

10
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 21:03 #2
Sky-WaLkeR, напрямую, насколько я знаю, нельзя.
Попробуй разбирать функцию на имя и аргументы. В зависимости от имени вызвать определенную ф-цию и передать аргументы
1
Sky-WaLkeR
1 / 1 / 0
Регистрация: 15.06.2012
Сообщений: 59
28.06.2012, 21:05  [ТС] #3
Жаль... То есть придется писать все в одной функции и делать switch на аргументы?
P.S: Спасибо за быстрый ответ.
0
Ksan
27 / 27 / 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]);
}

ну как-то так
0
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, ...);
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 21:37 #6
Sky-WaLkeR, создай класс Menu и наследуй его. Перегружай функции
0
Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
28.06.2012, 21:47 #7
попробуйте atexit, только там вызывается функция по указателю
1
Sky-WaLkeR
1 / 1 / 0
Регистрация: 15.06.2012
Сообщений: 59
28.06.2012, 21:51  [ТС] #8
Цитата Сообщение от ZoRT Посмотреть сообщение
atexit
Вот, это уже ближе... Никак нельзя заставить ее принимать имя функции из переменной? (параметры передавать мне и не надо в принципе....)
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 22:02 #9
Sky-WaLkeR, ты можешь создать void* и указать на функцию. Но это забивание гвоздей микроскопом. Твоя задача решается наследованием классов
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
28.06.2012, 22:09 #10
ZoRT, все что делает atexit, это просто устанавливает функции, которые будут вызываться по окончанию работы программы.

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

Можно ли запустить отдельным потоком функцию-член класса? - C++
sbjct

Передача переменной в функцию - C++
Здравствуйте. Подскажите пожалуйста как сделать следующее: есть класс: #pragma once #include &quot;Point2d.h&quot; #include &lt;vector&gt; ...

Передача переменной из функции в функцию - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; // работа с файлами #include &lt;iomanip&gt; // манипуляторы ввода/вывода #include &lt;string&gt; using...

Ошибка в значении переменной, передаваемой в функцию - C++
Странный вопрос конечно, ошибка в функции (верней число), но я не могу понять почему не работает правильно. #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.