Форум: Форум C++Разное
Новые темы: 00
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Массив ссылок на функции класса
 
 автор: therom   (30.09.2008 в 16:37)   письмо автору
 
 

Задача:
В классе иметь массив ссылок на функции этого класса, чтобы вызывать их по номеру из массива.
Также в классе должна присутствовать функция обработки массива с целью получения ссылки на функции (по номеру в массиве) и их вызова.
Например: нужно вызвать функцию №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

Как правильно реализовать задачу?

  Ответить  
 
 автор: Фитч   (30.09.2008 в 18:54)   письмо автору
 
   для: therom   (30.09.2008 в 16:37)
 

Существует различие между указателями на обычные функции (и, что технически то же самое, на статические члены класса) и на методы объектов. Дело в том, что методам требуется дополнительный "скрытый аргумент", указатель this, который содержит адрес объекта, для которого вызывается метод. Этим аргументом занимается, компилятор, а вы просто пишете a->b, ни о чем не задумываясь.

Если вы хотите создавать ссылки (в смысле переменные) на методы конкретных объектов, то вам придется самому реализовывать эту возможность. Она, кстати, называется делегированием (соответственно переменная - делегат, delegate).

Хорошая статья по этому поводу была на сайте RSDN.ru; конкретную ссылку дать не могу, но статья, кажется, была в разделе Статьи->C/C++->C++ Arena и называлась "Делегаты в С++". Там приведена реализация класса-обертки через шаблоны.

ЗЫ:
Если нужны указатели на статические члены (не как в примере), то это решается проще.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования