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

时间:2018-04-21 00:40:23

标签: c++ member-function-pointers

这编译得很好,但是给了我一个链接器错误"未定义的引用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可以让它更清洁。我尝试过这种方法,但我也不确定如何做到这一点。

2 个答案:

答案 0 :(得分:1)

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

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

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

这定义了一个返回指向类成员的指针的类方法。非常满口。

  

我意识到一个typedef可以让它更清洁。

是的,它会的。非常鼓励使用typedef。使得保持更多的一个人的理智成为可能。这总是一件好事。

P.S。 - 如果你真的试图编译你在问题中显示的确切代码,它就不会“编译好”,尽管你的断言不然。您将收到以下编译错误,该错误为发生的事情提供了一个很大的线索:

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},

咦?为什么类方法无法引用另一个私有类方法?哦!

答案 1 :(得分:1)

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

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)();