nixp.ru v3.0

30 мая 2017,
вторник,
00:02:09 MSK

DevOps с компанией «Флант»
sandy написал 14 июня 2007 года в 11:06 (404 просмотра) Ведет себя как мужчина; открыл 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);

}

Все работало. А вот с первым примером, не знаю как быть…

Heavy

v.(*fptr(i)); — может так вызывать

sandy
Heavy
v.(*fptr(i)); — может так вызывать

Интересное предположение…

myst

Поищи в Страуструпе про mem_ptr

sandy
myst
Поищи в Страуструпе про mem_ptr

Может mem_fun()?

myst

ну что-то вроде того, я точно не помню.

sandy

Решил обойти эту проблему с помощью статических функций.

Правда в такие функции, для работы с челнами класса приходится передавать указатель на эти члены

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);

}

Примерно так…

sas


#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

sandy

Спасибо. Я уже и сам разобрался. Главное, с приоритетом операторов не запутаться.

Хотя, возможно, в случае со статическими функциями я выигрываю в производительности