sandy
написал 14 июня 2007 года в 11:06 (999 просмотров)
Ведет себя
как мужчина; открыл 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 декабря 2023 года в 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
DevOps as a Service from Palark
24/7 SRE & DevOps service to cover all your Kubernetes needs.

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);
}
Примерно так…
#include #include class A { private: typedef void (A::*FP)( int ); std::vector v_; public: A() { v_.push_back( &A::m1 ); v_.push_back( &A::m2 ); } void m1( int i ) { std::cout << "m1( " << i << " )\n"; } void m2( int i ) { std::cout << "m2( " << i << " )\n"; } void execute( int i ) { FP fp = v_[ i ]; (this->*fp)( i ); } }; int main( int argc, char** argv ) { A a; a.execute( 0 ); a.execute( 1 ); return 0; }Good luck
— sas
Спасибо. Я уже и сам разобрался. Главное, с приоритетом операторов не запутаться.
Хотя, возможно, в случае со статическими функциями я выигрываю в производительности