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

Оператор [] массива указателей на процедуры и методы - C++

Восстановить пароль Регистрация
 
SavoninDima
0 / 0 / 0
Регистрация: 22.03.2012
Сообщений: 5
03.10.2012, 00:52     Оператор [] массива указателей на процедуры и методы #1
Доброго времени суток. Проблема заключается в следующем: нужно написать класс, который хранил бы в себе оператор обращения к массиву класса по индексу. Все это делается для создания массива функцию класса Keyboard, который можно было бы инициализировать, изменять и вызывать. Запись должна принимать следующий вид:
1) Инициализация:
C++
1
Keyboard[KEY_ENTER] = display;
2) Вызов:
C++
1
2
3
4
void keyboard(unsigned char key, int, int)
{
    Keyboard[key]();
}
Вот сам класс (*.h):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define FUNCTION_MAX 255
class cKeyboard
{
private:
    void (*Function[FUNCTION_MAX])(void);
    typedef void (*TFunPtr)(void);
 
public:
    cKeyboard();
    ~cKeyboard();
 
public:
    void Catch(unsigned char _Key);
    void Catch(int _Key);
    TFunPtr& operator [] (int _Index);
};
Исполнитель (*.cpp):
C++
1
2
3
4
5
6
7
8
9
Engine::cKeyboard::TFunPtr& Engine::cKeyboard::operator [] (int _Index)
{
    if (_Index >= 0 && _Index <= FUNCTION_MAX - 1)
    {
        return Function[_Index];
    }
 
    printf("ERROR %s: Wrong Index (0 to 255)\n", __FUNCTION__);
}
Если производить инициализацию процедуры, то все отлично, но если производить инициализацию или вызов метода, то программы выдает ошибку следующего рода:
Ошибка 1 error C3867: Print::Show: в вызове функции отсутствует список аргументов; используйте "&Print::Show" для создания указателя на член c:\users\dmitr_000\documents\visual studio 2012\projects\gmenu\gmenu\main.cpp 128 1 GMenu
Ошибка 2 error C2440: =: невозможно преобразовать "void (__thiscall Print::* )(void)" в "Engine::cKeyboard::TFunPtr" c:\users\dmitr_000\documents\visual studio 2012\projects\gmenu\gmenu\main.cpp 128 1 GMenu
Вызывается это все отсюда:
C++
1
2
3
4
5
6
7
8
class Print
{
public:
    void Show(void)
        { std::cout << "Hello World!\n"; }
};
 
Print P;
Какие есть решения данной проблемы?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2012, 00:52     Оператор [] массива указателей на процедуры и методы
Посмотрите здесь:

Решите програмку С++ на оператор процедуры/функции)))заранее благодарю)))оч надо C++
C++ Вектор указателей и оператор "стрелка"
Удаление массива указателей C++
Массив указателей на методы класса C++
Массив указателей на методы класса C++
C++ Проверка выделения памяти указателей через оператор new
C++ Передача указателей в методы по ссылке
C++ Связь массива и указателей

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
03.10.2012, 01:49     Оператор [] массива указателей на процедуры и методы #2
как вариант
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
#include <iostream>
#include <functional>
#include <vector>
 
class test_class
{
public:
    typedef std::function<int (int)> functor_t;
 
    functor_t& operator [] (int index)
    {
        if(index < 0 || index > m_array.size())throw std::exception("out of range");
 
        if(index == m_array.size())
            m_array.push_back(0);
 
        return m_array[index];
    }
 
private:
    typedef std::function<int (int)> functor_t;
 
    std::vector<functor_t> m_array;
};
 
int some_function(int value)
{
    std::cout << "hello " << value << std::endl;
    return 0;
}
 
int main()
{
    test_class object;
    object[0] = std::bind(some_function, std::placeholders::_1);
    object[0](42);
 
    system("pause");
}
Добавлено через 20 минут
Цитата Сообщение от I.M. Посмотреть сообщение
C++
1
2
if(index == m_array.size())
 m_array.push_back(0);
Небольшая ремарка по своему же коду. Лучше вынести добавление нового элемента в отдельный метод. Ибо так, как есть сейчас, очень небезопасно и нелогично.
SavoninDima
0 / 0 / 0
Регистрация: 22.03.2012
Сообщений: 5
03.10.2012, 11:50  [ТС]     Оператор [] массива указателей на процедуры и методы #3
Цитата Сообщение от I.M. Посмотреть сообщение
как вариант
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
#include <iostream>
#include <functional>
#include <vector>
 
class test_class
{
public:
    typedef std::function<int (int)> functor_t;
 
    functor_t& operator [] (int index)
    {
        if(index < 0 || index > m_array.size())throw std::exception("out of range");
 
        if(index == m_array.size())
            m_array.push_back(0);
 
        return m_array[index];
    }
 
private:
    typedef std::function<int (int)> functor_t;
 
    std::vector<functor_t> m_array;
};
 
int some_function(int value)
{
    std::cout << "hello " << value << std::endl;
    return 0;
}
 
int main()
{
    test_class object;
    object[0] = std::bind(some_function, std::placeholders::_1);
    object[0](42);
 
    system("pause");
}
Добавлено через 20 минут

Небольшая ремарка по своему же коду. Лучше вынести добавление нового элемента в отдельный метод. Ибо так, как есть сейчас, очень небезопасно и нелогично.
Отлично, сейчас опробую. Спасибо.

По поводу ремарки, сам столкнулся с данной проблемой когда свой метод допиливал. Уже так и сделал.

Добавлено через 5 минут
Ругается компилятор на ваш метод:
Ошибка 1 error C2064: результатом вычисления фрагмента не является функция, принимающая 1 аргументов c:\program files (x86)\microsoft visual studio 11.0\vc\include\xrefwrap 431 1 Empty
VC12

Добавлено через 6 минут
Все исправил ошибку, и думаю, что лучше использовать массив, а не вектор.

Добавлено через 10 минут
После различных вариаций моего класса, решил, что проще всего будет сделать так: круглые скобки буду отвечать за инициализацию, а квадратные за вызов.

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
#include <iostream>
#include <functional>
#include <vector>
 
#define MAXFUNCTION 255
 
class test_class
{
private:
    typedef std::function <int (int)> function_t;
    function_t m_array [MAXFUNCTION];
 
public:
    function_t& operator [] (int Index)
    {
        return m_array[Index];
    }
 
    function_t& operator () (int Index)
    {
        return m_array[Index];
    }
};
 
int some_function(int value)
{
    std::cout << "hello " << value << std::endl;
    return 0;
}
 
int main()
{
    test_class object;
 
    object(13) = some_function;
    object(10) = some_function;
 
    object[13](3);
    object[10](5);
 
    system("pause");
}
Yandex
Объявления
03.10.2012, 11:50     Оператор [] массива указателей на процедуры и методы
Ответ Создать тему
Опции темы

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