我正在尝试构建一个依赖于输入参数的类型的对象。例如。我的对象被称为'process',并且在运行时输入一个介于2和5之间的整数(包括),并且会发生类似这样的事情:
if (input == 2) TwoJ process;
if (input == 3) ThreeJ process;
if (input == 4) FourJ process;
if (input == 5) FiveJ process;
显然上述内容不起作用,因为该对象立即超出范围。有没有办法很好地实现这个? 干杯
答案 0 :(得分:8)
使用factory function返回smart pointer到基类Process
类,其实现由提供给工厂函数的整数值确定(要求所有类都有一个共同的基数)。
例如:
class Base_process
{
public:
virtual ~Base_process() {}
virtual void do_something() = 0;
};
class TwoJ : public Base_process
{
public:
void do_something() {}
}
class ThreeJ : public Base_process
{
public:
void do_something() {}
}
std::unique_ptr<Base_process> make_process(int a_type)
{
if (a_type == 1) return std::unique_ptr<Base_process>(new TwoJ());
if (a_type == 2) return std::unique_ptr<Base_process>(new ThreeJ());
// Report invalid type or return an acceptable default if one exists.
throw std::invalid_argument("Unknown type:" + std::to_string(a_type));
}
答案 1 :(得分:2)
一种工厂方法
std::unique_ptr<ProcessType> CreateProcess(int input){
if(input == 2) return std::unique_ptr<ProcessType>(new TwoJ());
.....
}
当然,这假设您使用的各个类具有公共基类,此处为ProcessType
,并且您对通过基类指针与它进行交互感到满意。
答案 2 :(得分:0)
你可以但是,你需要1个基类,例如。
Base* process;
if (input == 2) process = new TwoJ();
if (input == 3) process = new ThreeJ();
然后访问所有你需要的课程:
if (input == 2) (TwoJ*)process->someTwoJMethod();
或使用dynamic_cast:
TwoJ* p = dynamic_cast<TwoJ*>(process);
if(p != 0) {
p->someTwoJMethod();
}
有了这个,你有责任在对象超出范围后删除它。
以前的答案是使用std::unique_ptr
的cpp的最佳方式。当对象超出范围时,对象将自动被删除。