根据C ++中的输入参数创建属于类的对象

时间:2013-07-02 10:33:06

标签: c++ class oop

我正在尝试构建一个依赖于输入参数的类型的对象。例如。我的对象被称为'process',并且在运行时输入一个介于2和5之间的整数(包括),并且会发生类似这样的事情:

if (input == 2) TwoJ   process;
if (input == 3) ThreeJ process;
if (input == 4) FourJ  process;
if (input == 5) FiveJ  process;

显然上述内容不起作用,因为该对象立即超出范围。有没有办法很好地实现这个? 干杯

3 个答案:

答案 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的最佳方式。当对象超出范围时,对象将自动被删除。