Указатель функции-члена объектов отличается, но они выполняются в одной и той же функции-члене. Код следующим образом:
class A {
public:
A *child = NULL;
void (A::*_backwardFunc)() = NULL;
void FuncA()
{
cout << "This is function A." << endl;
}
void FuncB()
{
cout << "This is function B." << endl;
}
void set(int token = 0)
{
this->_backwardFunc = (token == 0) ? &A::FuncA : &A::FuncB;
}
void print()
{
if (_backwardFunc) {
(this->*_backwardFunc)();
}
if (child && child->_backwardFunc) {
(child->*_backwardFunc)();
}
}
};
int main()
{
A a, b;
a.set(0);
b.set(1);
a.child = &b;
a.print();
b.print();
}
Ожидание:
Это функция А.
Это функция Б.
Это функция Б.
Но я получил:
Это функция А.
Это функция А.
Это функция Б.
Кто-нибудь знает? Большое спасибо.
Вы можете выполнить это с помощью отладчика. Это, вероятно, полностью объясняет поведение.
Протестировано в Linux: g++ (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5).
@ Игорь Р. Верно. obj - заданная функция A, obj b заданная функция B. и дочерним элементом a является b.
Для a.print();
в print()
(child->*_backwardFunc)();
вызывает a._backwardFunc
(на child
), указывает на A::FuncA
. Если вы хотите вызвать child->_backwardFunc
(что указывает на A::FuncB
), это должно быть
(child->*(child->_backwardFunc))();
Звучит как "(child->*_backwardFunc)();" работал как "(this->*_backwardFunc)();" Почему "ребенок->" не подходит? Я нашел "(this->*(child->_backwardFunc))();" также действует.
@kaiyuanxie (this->*_backwardFunc)();
звонит _backwardFunc
на this
, это не то же самое, что (child->*_backwardFunc)();
, который звонит _backwardFunc
на child
. Это зависит от вашего намерения, какой указатель функции-члена вы хотите вызвать для какого объекта?
Цель состоит в том, что каждый объект имеет свой собственный указатель функции-члена, указывающий на разные функции-члены, и может быть вызван в определенном объекте. например. Ptr Class_obj_a указывает на Class_FuncA, а ptr Class_obj_b указывает на Class_FuncB. Class_obj_b->*ptr
должен запускать Class_FuncB везде, где он находится внутри или вне класса. Однако в данном случае меня смутило «->» из (child->*_backwardFunc)();
.
Почему вы этого ожидаете? Вы выбираете функцию А для объекта А, не так ли?