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

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

Войти
Регистрация
Восстановить пароль
 
SavoninDima
0 / 0 / 0
Регистрация: 22.03.2012
Сообщений: 5
#1

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

03.10.2012, 00:52. Просмотров 507. Ответов 2
Метки нет (Все метки)

Доброго времени суток. Проблема заключается в следующем: нужно написать класс, который хранил бы в себе оператор обращения к массиву класса по индексу. Все это делается для создания массива функцию класса 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;
Какие есть решения данной проблемы?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2012, 00:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Оператор [] массива указателей на процедуры и методы (C++):

Почему обращение к методам осуществляется через оператор прямого доступа, а не через оператор указателей->? - C++
#include &lt;iostream&gt; using namespace std; class random { public: void Set(int b){a=b;} int Get(){return a;} private: ...

Массив указателей на методы класса - C++
Подскажите плз в чём ошибка: class Entrant{ int ID; int mark; int school; int addpt; ...

Массив указателей на методы класса - C++
Есть несколько объектов разных классов. Каждый из этих классов имеет метод update. Параметры и возвращаемое значение одинаковы. Как...

Передача указателей в методы по ссылке - C++
Здравствуйте, хотел спросить, такой варианте адекватен? Или есть более адекватное решение... Просто непривычно передавать в метод...

Проверка выделения памяти указателей через оператор new - C++
И так есть некая структура, экземпляр которой определён как: var ***v; Изначально заполняю экземпляр: v = new var**; // создание...

Добавление нового указателя в конец массива указателей, удаление указанного элемента, добавление указателей - C++
Здравствуйте. Помогите, пожалуйста, разобраться с одним большим заданием. Задание пока в процессе написания, но уже наверное есть ошибки....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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);
Небольшая ремарка по своему же коду. Лучше вынести добавление нового элемента в отдельный метод. Ибо так, как есть сейчас, очень небезопасно и нелогично.
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");
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2012, 11:50
Привет! Вот еще темы с ответами:

Оператор noexcept и перегруженные методы класса - C++
Всем привет Как проверить с помощью noexcept, кидает ли исключение нужный мне перегруженный метод? #include &lt;iostream&gt; #include...

Массив указателей на массив строк и сортировка массива указателей - C++
Добрый день. Поступил вопрос. Есть задача. У нас встроенный массив char mass;.Мы вводим строки до тех пор, пока не будет заполнен массив...

Вектор указателей и оператор "стрелка" - C++
Не получается реализовать отбражение содержимого контейнера, при помощи оператора -&gt;. Задания и мои коментарии к коду продоставлены ниже....

Сортировка массива структур через сортировку массива указателей - C++
Ошибка возникает в функции void sort(student **ppStud, int k, char ch). Кто видит ошибку - помогите, пожалуйста. Код программы: ...


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

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

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