У меня есть некоторая путаница относительно того, как использовать указатель на функцию-член, которая сама является членом-данными:
struct Foo
{
void bar(int x)
{
cout << x << endl;
}
double getVal(double d)
{
return ++d;
}
void(Foo::*pMemFunc)(int) = &Foo::bar;// ptr to mem func
int(Foo::*pMemI) = &Foo::val_;// ptr to mem data
int* pI = &val_;
int val_ = 57;
};
int main()
{
Foo f, *pF = new Foo{};
double(Foo::*pMemFun)(double) =
&Foo::getVal;
cout << (f.*pMemFun)(3.14) << endl;// dereferencing a pMemFun yields a the member getVal so we need an object or pointer to call it.
cout << (pF->*pMemFun)(2.08) << endl;// through pointer to Foo obj
f.Foo::pMemFunc = &Foo::bar;
// f.Foo::pMemFunc(5);// how to use this?
cout << "\nDone!\n";
}
Так что pMemFunc
- это указатель на функцию-член, но сам указатель является данные члена класса Foo
так, как я могу вызвать функцию-член, на которую она указывает?
Я пробовал что-то вроде этого:
f.(*f.pMemFunc)(0);
Но это не работает. Сложнее то, что доступ к этому члену должен осуществляться через объект, например f.pMemFunc
или pF->pMemFunc
, а затем разыменовывать его, чтобы получить функцию-член, которой нужен объект для вызова, поэтому я пытаюсь: f.(*f.pMemFunc)(10);
, но я получаю ошибку во время компиляции .
Пожалуйста, объясните, как это сделать. Спасибо!
Но объясните пожалуйста, почему сейчас это работает и что происходит?