|
|
|
| Задача:
В классе иметь массив ссылок на функции этого класса, чтобы вызывать их по номеру из массива.
Также в классе должна присутствовать функция обработки массива с целью получения ссылки на функции (по номеру в массиве) и их вызова.
Например: нужно вызвать функцию №2 класса MyClass........
typedef void (*PF)(void); //Это для ссылки на функцию
// Есть класс:
class MyClass
{
public:
void func1(void){}
void func2(void){}
PF massiv[2]; // создаем массив ссылок для функций
MyClass(void) // Конструктор
{
// в конструкторе присваиваем ссылкам адреса функций
massiv[0]=&func1;
massiv[1]=&func2;
}
};
Выскакивает ошибка в строках конструктора:
Error[Pe144]: a value of type "void (__nearfunc __version_3 MyClass::*)(void)" cannot be used to initialize an entity of type "PF"
Насколько я понял: на стадии конструирования класса еще не известны точные адреса функций
Приняв это предположение как факт, я попытался передать конструктору адрес класса:
MyClass(MyClass* adres) // Конструктор
{
// в конструкторе присваиваем ссылкам адреса функций
massiv[0]=&adres->func1;
massiv[1]=&adres->func2;
}
Теперь выскочила друкая ошибка:
Error[Pe300]: a pointer to a bound function may only be used to call the function
Как правильно реализовать задачу? | |
|
|
|
|
|
|
|
для: therom
(30.09.2008 в 16:37)
| | Существует различие между указателями на обычные функции (и, что технически то же самое, на статические члены класса) и на методы объектов. Дело в том, что методам требуется дополнительный "скрытый аргумент", указатель this, который содержит адрес объекта, для которого вызывается метод. Этим аргументом занимается, компилятор, а вы просто пишете a->b, ни о чем не задумываясь.
Если вы хотите создавать ссылки (в смысле переменные) на методы конкретных объектов, то вам придется самому реализовывать эту возможность. Она, кстати, называется делегированием (соответственно переменная - делегат, delegate).
Хорошая статья по этому поводу была на сайте RSDN.ru; конкретную ссылку дать не могу, но статья, кажется, была в разделе Статьи->C/C++->C++ Arena и называлась "Делегаты в С++". Там приведена реализация класса-обертки через шаблоны.
ЗЫ:
Если нужны указатели на статические члены (не как в примере), то это решается проще. | |
|
|
|