2015-10-14 67 views
2

我在Java中实现了一个小Factory class。它的最小版本看起来像这样:C++中的工厂模式。实例化问题

interface MyClass{ 
    public void doSomething(); 
} 

class Concrete_1 implements MyClass{ 
    private String field_1; 
    Concrete_1(String _field_1){ 
     // ... initialization 
    } 
    public void doSomething(){ 
     // ... not so important 
    } 
} 

class MyClassFactory{ 
    public static MyClass init(int idx, String val){ 
     Concrete_1 ex = null; 
     switch(idx){ 
     case 1: 
      ex = new Concrete_1(val); 
      break; 
     default: 
      break; 
     } 
     return ex; 
    } 
    public static void main(String args[]){ 
     MyClass ex = MyClassFactory.init(1, "value"); // <-- I like that 
    } 
} 

我喜欢它的工作方式,尤其是这样,我怎么可以实例特定对象,如:

MyClass ex = MyClassFactory.init(1, "value"); 

现在,我要的是要实现相同的在C++中的事情。我见过一些例子(包括一些在stackoverflow的线程),但在所有这些例子中,他们使用abstarct类(而不是我的Java中的接口)。如果内存服务器对我来说,创建抽象类的实例是不可能的。所以,如果我们只是口上面的代码到C++,并使用一些抽象类而不是接口,它不会工作,因为这是禁伐:

MyClass ex = MyClassFactory.init(1, "value"); // <-- MyClass now is abstract 
    // so this is illegal 

我的问题是我怎么做就怎么做同样的事情在C++?谢谢!

+3

不能创建Java中的'interface'的情况下,无论是。 C++中的抽象类与Java中的接口类似。 –

+1

'Java' *引用*在很多方面等价于'C++'指针。因此,在'Java'中,'MyClass ex = ...'将成为'C++''MyClass * ex = ...'。但是如答案所示,您应该在*智能指针*中管理返回的指针。 – Galik

+0

谢谢你提供有用的信息! – Jacobian

回答

2

您可以使用指针或引用来处理这些。例如。

std::shared_pointer<MyClass> ptrClass = MyClassFactory.init(1, "value"); 

由于C++中的工厂通常会返回指针,因此您可能会坚持使用指针选项。并提示:不要使用原始指针。改为使用共享指针或唯一指针,并从工厂返回共享指针。

更完整的解决方案将是:

class MyClassFactory{ 
    public: 
     MyClass* init(int idx, std::string val){ 
     switch(idx){ 
     case 1: 
      return new Concrete_1; 
     default: 
      return nullptr; 
     } 
    } 
}; 

加入1:

关于返回工厂的类型,请查看: What is the best smart pointer return type for a factory function?

人评价它。我终于把它作为非智能指针,并且认为它是个好主意或不请,请看上面的链接。在我看来,smart_pointers应该始终使用,但是正如你所愿。

+0

非常感谢!这看起来很有希望!我会尽快接受,我会允许 – Jacobian

+0

这个想法。这真的很重要! :) – Jacobian

+2

我不知道,天气'shared_ptr '是这里最好的选择。其实我会考虑返回一个原始指针,并让用户关心它的一生。例如。一个'unique_ptr '可能会更适合他。他可以做'make_unique(myClassFactory.init(42,“sadf”s));''或'make_shared(myClassFactory。init(42,“sadf”s));'如他所需。 – cdonat

1

在这种情况下,Java和C++之间的区别是在C++中,您必须使用指针

使用new创建具体类,并将其作为指针返回给基类。

3

在C++中它可以通过指针来达到:

struct MyClass{ 
    virtual void doSomething() = 0; 
}; 

class Concrete_1 : public MyClass { 
    String field_1; 
public: 
    Concrete_1(String _field_1){ 
    // ... initialization 
    }; 
    void doSomething(){ 
    // ... not so important 
    } 
}; 

class MyClassFactory{ 
public: 
    std::shared_ptr<MyClass> init(int idx, String val){ 
     switch(idx){ 
     case 1: 
      return std::shared_ptr<MyClass>(new Concrete_1(val)); 
     } 
     return std::shared_ptr<MyClass>(); 
    } 
}; 

int main(...) { 
    std::shared_ptr<MyClass> ex = MyClassFactory::init(1, "value"); 
} 
+0

感谢您提供完整的解决方案!这看起来很棒! – Jacobian