如何调用返回类方法指针的类方法?

Posted

技术标签:

【中文标题】如何调用返回类方法指针的类方法?【英文标题】:How do I call a class method that returns a class method pointer? 【发布时间】:2018-04-21 00:40:22 【问题描述】:

这编译得很好,但给了我一个链接器错误“未定义对 A::a(std::string const&) 的引用”

如何正确调用 A::a(const std::string& name) 以及如何在 doSomething() 方法中正确调用 funcTable.second()?

.h 文件:

class A 
    void (A::*a(const std::string& name))() const;
    void func1() const;
    void func2() const;
    void doSomething();
;

.cpp 文件:

void (A::*a(const std::string& name))() const 
    const std::map<const std::string, void (A::*)() const> funcMap = 
        "name1", &A::func1,
        "name2", &A::func2
    ;
    return funcMap.at(name);

void A::func1() const 
    // call func1

void A::func2() const 
    // call func2

void A::doSomething() 
    std::pair<std::string, void (A::*)() const> funcTable;
    funcTable.first = "func1";
    funcTable.second = a("name1");    // This is my problem
    // Not even sure how to then call funcTable.second()

我意识到 typedef 会使这更清晰。我尝试了这种方法,但我也不知道该怎么做。

【问题讨论】:

【参考方案1】:
void (A::*a(const std::string& name))() const 

这不是定义你的类方法。这是在全局命名空间中定义一个独立函数,它返回一个类方法指针。你想要的是:

void (A::*A::a(const std::string& name))() const 

这定义了一个返回指向类成员的指针的类方法。好拗口。

我意识到 typedef 会让这更简洁。

是的,会的。非常鼓励使用 typedef。可以保持更多的剩余理智。这总是一件好事。

附: - 如果您实际上试图编译您在问题中显示的确切代码,它不会“编译好”,尽管您另有断言。您会收到以下编译错误,这为发生的事情提供了一个重要的提示:

t.C: In function ‘void (A::* a(const string&))() const’:
t.C:13:23: error: ‘void A::func1() const’ is private within this context
         "name1", &A::func1,

嗯?为什么一个类方法不能引用另一个私有类方法?哦!

【讨论】:

成功了,谢谢!我有我的 void func1() const 公开,所以我没有遇到这个问题,但你是绝对正确的 - 将它们设为私有给了我这个错误。【参考方案2】:

作为替代方案,我建议使用尾随返回类型,而不是那种丑陋的语法:

auto A::a(const std::string& name) -> void (A::*)() const  /* implementation */ 

funcTable.second = a("name1"); // This is my problem// Not even sure how to then call funcTable.second()

应该是这样的:

(instance.*funcTable.second)();

(this->*funcTable.second)();

【讨论】:

这太漂亮了!这更清楚了 - 谢谢。

以上是关于如何调用返回类方法指针的类方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在AJAX中调用.CS中的类

如何将工厂方法中的有效指针返回到基于底层操作系统的派生类

函数指针作为类方法声明中的参数

Objective-C中如何创建构造函数呢?

如何从封闭的外部类调用与匿名类中实现的方法同名的方法?

第一次访问后缓存返回值的类方法的装饰器