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

标签 c++ pointer-to-member

这编译得很好,但给了我一个链接器错误“ undefined reference A::a(std::string const&)”

如何在 doSomething() 方法中正确调用 A::a(const std::string& name) 以及如何正确调用 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 会让它变得更清晰。我尝试过这种方法,但我也不知道该怎么做。

最佳答案

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

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

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

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

I realize a typedef would make this a lot cleaner.

是的,会的。非常鼓励使用 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},

嗯?为什么一个类方法无法引用另一个私有(private)类方法?哦!

关于c++ - 如何调用返回类方法指针的类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49951289/

相关文章:

基于模板参数整数返回不同派生类的 C++ 模板

c++ - QML 标签最大宽度和多行

c++ - 无法将 Qt 信号连接到自定义类成员函数

c++ - 函数指针 - 明显调用的括号前面的表达式必须具有(指向)函数类型

c++ - 将模板参数传递给嵌套结构

c++ - 如何在 C++ 中使不明确的调用不同?

c++ - 从成员函数模板化参数调用成员函数

c++ - 单例中的 FunktionPointerArray

c++ - 在 C++ 中调用指向成员函数的指针时出错

c++ - 如何将函数指针的 std::vector 初始化为运算符重载?