![](/img/trans.png)
[英]Why can't I give constant reference of a pointer as function argument
[英]Why I can't use pointer to a function
有一个字段为double (A:: *ptrToFunc)();
的对象对象B
有A
; 不能在对象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 个问题。
Foo obj();
是成员函数声明而不是数据成员声明,因为解析很麻烦(注意没有“most”)。 即, Foo obj();
声明一个名为obj
的成员函数,没有参数,返回类型为Foo
。
要解决此问题,请将其替换为:
//-----vv--->use braces
Foo obj{};
第二个问题是语法return (obj.*ptrToFunc)();
不正确,因为obj.ptrToFunc
指的是指针,我们仍然需要在对象上使用该指针(如下所示)。
要解决第二个问题,请将其替换为:
(obj.*(obj.ptrToFunc))() // or same as (obj.*obj.ptrToFunc)()
在c++17中,您可以使用std::invoke
使代码更具可读性:
double countVal()
{
//--------------vvvvvv--------------------->use invoke
return std::invoke(obj.ptrToFunc, obj);
}
解决已接受答案指出的问题的另一种略有不同的方法。 我更喜欢 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.