繁体   English   中英

为什么我不能使用指向函数的指针

[英]Why I can't use pointer to a function

有一个字段为double (A:: *ptrToFunc)();的对象对象BA 不能在对象B中使用它。

class Foo
{
public:
    
    double (Foo :: *ptrToFunc)();
    
private:
    double func1();
    double func2();
    
public:
    Foo() : ptrToFunc{ &Foo::func1 } {}
}

class B
{
public:
    Foo obj();
    double countVal()
    {
        return (obj.*ptrToFunc)();  // use of undeclared identifier ptrToFunc
        return (obj.ptrToFunc)();  // called object (..) not a function or function pointer
    }
}

int main()
{
    B obj_B;
    double var = obj_B.countVal();
    return 0;
}

我已阅读C++ Tutorial: Pointer-to-Member Function但它对我没有帮助。

您的代码有2 个问题

问题1

Foo obj(); 是成员函数声明而不是数据成员声明,因为解析很麻烦(注意没有“most”)。 即, Foo obj(); 声明一个名为obj的成员函数,没有参数,返回类型为Foo

解决此问题,请将其替换为:

//-----vv--->use braces
Foo obj{};

问题2

第二个问题是语法return (obj.*ptrToFunc)(); 不正确,因为obj.ptrToFunc指的是指针,我们仍然需要在对象上使用该指针(如下所示)。

解决第二个问题,请将其替换为:

(obj.*(obj.ptrToFunc))() // or same as (obj.*obj.ptrToFunc)() 

工作演示


中,您可以使用std::invoke使代码更具可读性:

double countVal()
{
//--------------vvvvvv--------------------->use invoke
    return std::invoke(obj.ptrToFunc, obj); 
}

演示 c++17

解决已接受答案指出的问题的另一种略有不同的方法。 我更喜欢 std::invoke from 'functional' 而不是可以毫不费力地调用任何可调用的东西。

还使代码自包含,以便将来的读者可以轻松尝试。

#include <iostream>
#include <functional> class Foo { public:
    
    double (Foo::*ptrToFunc)();
     private:
    double func1() { return 1.0;}
    double func2() { return 2.0;}
     public:
    Foo() : ptrToFunc{&Foo::func2} {} };

class B { public:
    Foo obj = Foo();
    double countVal()
    {
        return std::invoke(obj.Foo::ptrToFunc, obj);       
    } };

int main() {
    B obj_B;
    double var = obj_B.countVal();
    std::cout << var << std::endl;
    return 0; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM