2015-10-14 71 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