设计具有多组方法实现的类[c ++]

时间:2015-07-19 11:57:34

标签: c++ design-patterns

我正在处理一个现有项目,该项目有一个类,我需要一个替代成员函数定义。我不想修改现有的成员函数或它们的签名,只是一个必须根据某个xml文件选择运行时的备用定义(编译时标记不是首选)。 我是C ++的新手,所以这可能是一个愚蠢的问题。

请建议设计指南,以便我不必更改和测试现有代码库,只需插入我的实现。

示例

class ABC{
public:
int operate(int, int);
}  
//Assume below method to be existing implementation
ABC::operate(int op1, int op2)
{
   return op1+ op2; //add
}

//Alternate desired implementation
ABC::operate(int op1, int op2)
{
   return op1 * op2; //multiply 
}

理想情况下,我希望上面是运行时选择,但如果这是唯一的方法,可能会落到编译时间。

1 个答案:

答案 0 :(得分:0)

我正准备回答,但Gulzar同时回答(他的回答结束)

你需要的是C ++中一个基本的概念/机制叫做动态绑定(也许你同时也学会了它,因为你的帖子是1个月大)

    #include <iostream>
    #include <cstddef>

    using namespace std;


    class ABC_Base
    {
        public:
            //pure virtual member function
            //compelling effective creation of the
            //function in the daughter classes
            virtual int operate(int,int) = 0;
            //virtual xtor as base will be derived
            virtual ~ABC_Base() {}
    };

    class ABC_M1 : public ABC_Base
    {
        int operate (int a, int b ) {return a+b; }
    };

    class ABC_M2 : public ABC_Base
    {
        int operate (int a, int b ) {return a*b; }
    };

    ABC_Base * createABC(string xml_filename)
    {
        int criterion = 0;

        // nullptr need at least c++11 option
        ABC_Base * ptr = nullptr;

        //read xml file and update criterion
        //see other post to do that
        //criterion = ...

        switch(criterion)
        {
            case 0:
                ptr = new ABC_M1();
                break;
            case 1:
                ptr = new ABC_M2();
                break;

            default:
                break;
        }
        return ptr;
    }


    int main()
    {
        ABC_Base * ptr = createABC("My_Config.xml");

        if (nullptr != ptr)
        {
            cout << ptr->operate(3,4) << endl;
        }

        // If you absolutely want / have to use plain old pointers
        // do not forget to release things
        // works even if ptr is null, so unconditional delete
        delete(ptr);

        return 0;
    }