如何从类方法返回成员函数指针?C++策略模式场景问题
策略模式中成员函数指针使用问题的解决方案
核心问题分析
- 私有成员访问限制:
ParsingText类中的parser是私有成员,main函数无法直接获取,导致你缺少调用成员函数指针所需的对象实例。 - 设计冗余违背模式初衷:策略模式的核心是通过抽象接口
IParser统一调用具体实现,返回成员函数指针的做法不仅增加了调用复杂度,也偏离了模式的简洁性设计。
方案1:封装方法调用(推荐)
直接在ParsingText中添加执行方法,内部处理具体调用逻辑,既保证封装性,又契合策略模式的设计思路,同时用智能指针避免内存泄漏。
修改后的完整代码:
#include <iostream> #include<string> #include <memory> using namespace std; class IParser { public: virtual ~IParser() = default; virtual string format() = 0; virtual string parse() = 0; }; class Type1Parser :public IParser { public: string format() override { cout << " Formatting 1"; return string(); } string parse() override { cout << " Parsing 1"; return string(); } }; class Type2Parser :public IParser { public: string format() override { cout << " Formatting 2"; return string(); } string parse() override { cout << " Parsing 2"; return string(); } }; class ParsingText { unique_ptr<IParser> parser; public: void setParser(int p) { if (p == 1) parser = make_unique<Type1Parser>(); else if (p == 2) parser = make_unique<Type2Parser>(); } void executeMethod(char o) { if (!parser) { cerr << "Parser not initialized!" << endl; return; } if (o == 'f') parser->format(); else parser->parse(); } }; int main() { ParsingText pt; pt.setParser(1); pt.executeMethod('f'); pt.setParser(2); pt.executeMethod('p'); return 0; }
方案2:暴露parser访问接口(不推荐)
如果一定要保留成员函数指针的使用方式,可以给ParsingText添加公共方法获取parser实例,但这种做法会破坏类的封装性:
// 在ParsingText类中添加 IParser* getParser() { return parser.get(); } // main函数修改为 int main() { ParsingText pt; pt.setParser(1); typedef string(IParser::* parseFunc)(); parseFunc myMethod = &IParser::format; IParser* parser = pt.getParser(); if (parser) { (parser->*myMethod)(); } return 0; }
补充说明
- 优先选择方案1,它更符合策略模式的设计原则,代码更简洁安全。
- 修正了原代码中
Parsering的拼写错误,改为正确的Parsing。 - 使用
unique_ptr替代裸指针,自动管理内存,避免内存泄漏问题。
内容的提问来源于stack exchange,提问作者Johnson Jose
相关产品推荐
相关产品推荐

