如何调用返回类方法指针的类方法?
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)();
【讨论】:
这太漂亮了!这更清楚了 - 谢谢。以上是关于如何调用返回类方法指针的类方法?的主要内容,如果未能解决你的问题,请参考以下文章