You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从类方法返回成员函数指针?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:20:27