gpt4 book ai didi

c++ - 如何通过指向成员数据的指针调用成员函数?

转载 作者:行者123 更新时间:2023-12-02 10:35:05 25 4
gpt4 key购买 nike

我对如何使用指向成员数据本身的成员函数的指针有些困惑:

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.pMemFuncpF->pMemFunc然后取消引用它会产生一个需要一个对象来调用它的成员函数,所以我尝试: f.(*f.pMemFunc)(10);但我得到编译时错误。

请解释如何做。谢谢!
  • 经过多次尝试,我终于以某种方式让它工作了:将表达式分解为多个部分:
    auto ret = f.pMemFunc; // 1
    (f.*ret)(0);// 2. works fine

  • 但是请解释为什么现在它可以工作以及会发生什么?!

    最佳答案

    我建议你使用 std::function将函数指针存储为成员。

    对于成员函数,对象是函数的隐式第一个参数。
    您可以使用 std::bind将函数绑定(bind)到特定对象(通过第一个参数)。优点是您可以将与对象的绑定(bind)与函数调用分开(例如,在准备步骤中)。

    来自 https://de.cppreference.com/w/cpp/utility/functional/bind :

    // bind to a member function
    Foo foo;
    auto fun = std::bind(&Foo::function, &foo, _1); // _1, _2, .. are placeholders for later arguments
    fun(5);

    而不是使用 &Foo::function直接,函数指针或 std::function可以作为 bind() 的第一个参数给出.

    关于c++ - 如何通过指向成员数据的指针调用成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60691668/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com