关于网友提出的“ 简单的c++设计模式和结构问题”问题疑问,本网通过在网上对“ 简单的c++设计模式和结构问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 简单的c++设计模式和结构问题
描述:C++类设计模式模板虚函数
现在有一段代码是这样的
class A
{
int var_int;
string var_string;
void core(string input);
void core(int i);
void test_1()
{
//..........
core(var_int)
//..........
}
void test_2()
{
//..........same as test_1()
core(var_string)
//..........same as test_1()
}
}
对于test_1()函数和test_2()来说除了core(var_int)和core(var_string)之外,其它的上下文代码都相同.因此很容易想到可以将2段代码合并。void core(string input);和void core(int i);内部逻辑是不一样的。但是如何在逻辑上进行合并?
现在想到如下几种
1.多态虚函数.从A类派生出A1,A2类,实现各自的core()函数,然后分别通过A类的test()虚函数控制子类的实现函数,到时只需将父类指针指向子类运行test()函数即可。
但是这样实现的话需要core的入参是一样的,这里core的入参是不一样的。
2.c++模板函数,模板的话可以解决core入参不同的问题。执行函数的时候只要自动带入参数,函数会自动判断类型。但是模板的话,需要函数的结构都是一样的,void core(string input);和void core(int i);内部逻辑是不一样的。
3.c++特化模板函数,特化模板函数可能可以解决这个问题,但是从扩展性的角度来说,如果以后还有void core(int *)之类的新核心函数出现的话,那么就得将新的特化模板函数写在A类中,破坏了A类原有的结构。
因此希望能够有什么办法可以解决这个问题。。。。。
解决方案1:
3的话可以理解的……2的话如果我没有理解错应该是这样的……虽然估计是我没理解你的意思……
#include
#include
#include
#include
#include
using namespace std;
class A
{
public:
void core(int a)
{
cout<<"1"<<>
}
void core(string a)
{
cout<<"2"<<>
}
template
void test_1(T var) {core(var); }
} b;
int main()
{
b.test_1(1);
b.test_1("1");
return 0;
}
解决方案2:
class A
{
public:
A ()
{
var_int = 2;
var_string = "1234";
}
int& GetInt()
{
return var_int;
}
string& GetString()
{
return var_string;
}
template
void test(T& var)
{
// code 1
core(var);
// code 2
}
private:
int var_int;
string var_string;
void core(string input)
{
printf("%s\n", input.c_str());
}
void core(int i)
{
printf("%d\n", i);
}
};
A a;
a.test(a.GetInt());
a.test(a.GetString());
解决方案3: 你的varint和varstring本来就A的东西,想要加新函数A本来就要改。
以上介绍了“ 简单的c++设计模式和结构问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3714161.html