我正在处理一个现有项目,该项目有一个类,我需要一个替代成员函数定义。我不想修改现有的成员函数或它们的签名,只是一个必须根据某个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
}
理想情况下,我希望上面是运行时选择,但如果这是唯一的方法,可能会落到编译时间。
答案 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;
}