вівторок, 3 березня 2009 р.

Оператори ->* , .*

Якось я захотів створити вказівник на функцію класу, і в залежності від певних обставин присвоювати йому вказівники на інші функції цього ж класу, для того, щоб при звернені до цього вказівника викликалась потрібна мені (залежно від обставин) функція. Звісно ж без знання цих операторів у мене нічого не вийшло. Дивно, що у багатьох авторитетних книжках по C++ про це не написано. Хочу звернути увагу, що ->* це не два окремих оператори, а один, так само як і .* Стрілочка-зірочка та крапочка-зірочка - окремі визначені оператори C++.

Ось простенький приклад:



#include < iostream>
using namespace std;
class MyClass
{
public:
MyClass(){}
~MyClass(){}

typedef void (MyClass:: *MY_FUNC_PTR)(int val);
// екземпляр вказівника на функцію класу
MY_FUNC_PTR stateFuncPtr;

void stateWaitFunc(int val)
{
cout < < val < < ". State WAITING function()" < < endl;
}
void stateDoFunc(int val)
{
cout < < val < < ". State DOING function()" < < endl;
}
void someFunk()
{
// присвоюємо вказівник на stateDoFunc функцію
stateFuncPtr = &MyClass::stateDoFunc;
// виклик функції stateDoFunc шляхом звертання до нашого вказівника
(this->*stateFuncPtr)(1);
// присвоюємо вказівник на stateWaitFunc функцію
stateFuncPtr = &MyClass::stateWaitFunc;
// виклик функції stateWaitFunc шляхом звертання до вказівника
(this->*stateFuncPtr)(2);
}
};

int main()
{
MyClass m;
m.someFunk();
// присвоюємо вказівник на stateDoFunc функцію (зовні класу)
m.stateFuncPtr = &MyClass::stateDoFunc;
// виклик функції stateDoFunc шляхом звертання до вказівника
(m.*m.stateFuncPtr)(3);
return 0;
}

Матеріал взято з власного наступання на граблі.

Немає коментарів:

Дописати коментар

Прихильники