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

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

Войти
Регистрация
Восстановить пароль
 
Darthriddikc
10 / 10 / 0
Регистрация: 23.12.2012
Сообщений: 45
#1

Вызов глобальной функции из объекта класса - C++

20.12.2013, 22:37. Просмотров 500. Ответов 3
Метки нет (Все метки)

Здравствуйте! Допустим, к примеру, имеется класс, который может хранить в себе адрес на функцию, а также метод который "запустит" эту функцию...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
 
typedef void (*NEXT_Act)();
 
class RunFunc{
    NEXT_Act nextAct;
public:
    RunFunc(NEXT_Act next){
        nextAct=next;
    }
    void start(){
        nextAct();
    }
};
 
void func1(){
    std::cout<<"!!!QwErTy!!!"<<std::endl;
}
 
int main(){
    RunFunc obj1(func1);
    obj1.start();
    return 0;
}
Объекты данного класса могут хранить и выполнять только void функции, которые без параметров... Если я хочу, чтоб объект делал всё тоже самое, но, допустим, с функцией с 2-мя параметрами, да ещё и возвращающая int, то, в данном случае, я делаю указатель на int функцию c 2-мя параметрами, дописываю в класс 2 переменные в которых будут храниться значения параметров, переделываю конструктор соответствующим образом, а также вызов функции в методе...
И вот у меня вопрос, есть ли такая возможность реализовать этот класс, чтобы он был универсален и не зависим от количества параметров и типа возвращающего значения функции, которые ему пытаются "впарить", то есть, чтобы не приходилось его переделывать под разные варианты?

Не по теме:

Лично я, никак не нахожу такую возможность... но я могу что-то упускать (иногда подчас что-то лежащее на поверхности ), и вот решил всё-таки спросить

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2013, 22:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вызов глобальной функции из объекта класса (C++):

Вызов функции с не заданными параметрами из объекта класса - C++
Пишу небольшое API, для себя. Сделал следующие: программист указывает объекту класса, имя пакета и какая должна будет вызваться функция,...

Объявление класса, создание объекта и вызов функции-члена - C++
Всем добрый день! Вот так я объявляю класс. typedef map&lt;string, double&gt; datablock; typedef map&lt;string, string&gt; groupvars; ...

Возможно ли создание объекта шаблонного класса в функции этого класса? - C++
Доброго времени суток, уважаемые форумчане :) Мне по лабам задали задание - реализовать шаблон контейнера (множество) с операциями...

ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса - C++
Здравствуйте! Столкнулся с такой проблемой: если есть родительский класс с конструктором, то при создании дочернего объекта от этого...

Вызов функции из класса - C++
есть функция объявленная в классе Calendar void calendar::menu_k() { cout&lt;&lt;&quot;\n\n&quot;; set_color(cGREEN); cout&lt;&lt;&quot;МЕНЮ&quot;&lt;&lt;endl; ...

Вызов функции вне класса - C++
Есть класс, в нем два метода. В одном из них надо вызвать функцию, которая расположена вне класса. Как зделать?? Можете на примере...

3
Убежденный
Системный программист
Эксперт С++
15637 / 7147 / 1131
Регистрация: 02.05.2013
Сообщений: 11,586
Записей в блоге: 1
Завершенные тесты: 1
20.12.2013, 23:49 #2
Можно нечто подобное сделать, используя C++11 и Boost.Bind.

Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
#include <boost/bind.hpp>
 
 
 
// Функция с двумя параметрами.
 
int TwoArgsFunction(char const *pArg1, char const *pArg2)
{
    return (printf("%s, %s!\r\n", pArg1, pArg2));
}
 
 
 
// Функция с тремя параметрами.
 
bool ThreeArgsFunction(int Arg1, int Arg2, int Arg3)
{
    printf("%d + %d + %d = %d\r\n", Arg1, Arg2, Arg3, Arg1 + Arg2 + Arg3);
    return true;
}
 
 
 
// Класс, который будет вызывать функции по запросу.
 
template <typename T>
struct caller
{
    caller(T t) : m_t(t) {}
    void call() { m_t(); }
    T m_t;
};
 
 
 
// Функция для создания объектов "caller" (чтобы не нужно
// было указывать точный тип шаблонного параметра).
 
template <typename T>
caller<T> create_caller(T t) { return (caller<T>(t)); }
 
 
 
int main()
{
    auto Caller1 = create_caller(boost::bind(TwoArgsFunction, "Hello", "World"));
    auto Caller2 = create_caller(boost::bind(ThreeArgsFunction, 100, 200, 300));
 
    Caller1.call();
    Caller2.call();
 
    return 0;
}
Вывод:
> Hello, World !
> 100 + 200 + 300 = 600
1
Darthriddikc
10 / 10 / 0
Регистрация: 23.12.2012
Сообщений: 45
21.12.2013, 00:21  [ТС] #3
Убежденный, спасибо, получается, что здесь можно, только с помощью библиотек boost'а
0
Убежденный
Системный программист
Эксперт С++
15637 / 7147 / 1131
Регистрация: 02.05.2013
Сообщений: 11,586
Записей в блоге: 1
Завершенные тесты: 1
21.12.2013, 00:28 #4
Не обязательно, наверняка есть и другие способы.
Например, стоит (для расширения кругозора) попробовать
сделать то же самое на variadic templates, std::tuple, va_arg.
Или даже на макросах...
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2013, 00:28
Привет! Вот еще темы с ответами:

Вызов функции в шаблоне класса - C++
Выполняю,через шаблоны класса. Вообщем,в меню не могу вызвать функции. Скажите,все ли правильно в вызове функций? вот файл .h ...

Вызов функции по указателю из класса - C++
Такой расклад. Допустим имеем код: #include &lt;iostream&gt; using namespace std; template &lt;class _Tp&gt; class my_mem_fun_t { ...

вызов статичной функции класса - C++
Добрый день. Не могу изменить класс так, чтобы можно было вызывать функцию непосредственно из класса не создавая новый объект класса. ...

Вызов функции класса по каллбеку - C++
Хочу реализовать возможность вызова метода класса по каллбеку. Сделал такой класс: class ICallable { public: ICallable ();...


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

Или воспользуйтесь поиском по форуму:
4
Yandex
Объявления
21.12.2013, 00:28
Ответ Создать тему
Опции темы

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