sandy
написал 14 июня 2007 года в 11:06 (882 просмотра)
Ведет себя
как мужчина; открыл 10 тем в форуме, оставил 54 комментария на сайте.
Внутри класса есть контейнер указателей на функции-члены этого класса
Допустим так:
class A {
std::vectorv;
public:
A();
void MyFunc1(int);
void MyFunc2(int);
void Execute(int)
};
A::A() : v(2)
{
v[0]=&A::MyFunc1;
v[1]=&A::MyFunc2;
}
void A::Execute(int i)
{
v.fptr(i); // Ругань
}
Ругань такая:
error: must use .* or ->* to call pointer-to-member function in `fptr (…)'
Когда примерно такое же писал, но указатель был на член другого класса, то я получал указатель на этот класс:
class B {
public:
void MyFunc(int)
};
void A::Execute(B& b, int i)
{
B* p=&b;
void (B::*fptr) (int) = &B::MyFunc;
p->*fptr (i);
}
Все работало. А вот с первым примером, не знаю как быть…
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
v.(*fptr(i)); — может так вызывать
Интересное предположение…
Поищи в Страуструпе про mem_ptr
Может mem_fun()?
ну что-то вроде того, я точно не помню.
Решил обойти эту проблему с помощью статических функций.
Правда в такие функции, для работы с челнами класса приходится передавать указатель на эти члены
class A {
T* t;
std::vectorv;
public:
A();
static void MyFunc1(int, T*);
static void MyFunc2(int, T*);
void Execute(int)
};
A::A() : v(2)
{
v[0]=&MyFunc1;
v[1]=&MyFunc2;
}
void A::Execute(int i)
{
v.fptr(i, t);
}
Примерно так…
Good luck
— sas
Спасибо. Я уже и сам разобрался. Главное, с приоритетом операторов не запутаться.
Хотя, возможно, в случае со статическими функциями я выигрываю в производительности