2013-07-02 36 views
1

我試圖建立一個類型取決於輸入參數的對象。例如。我的對象被稱爲「進程」,並在運行時2和5(含)之間的整數輸入和東西有點像這種情況會發生:根據輸入參數在C++中創建一個對象屬於一個類

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

顯然上述不起作用,因爲對象超出範圍立即。有沒有一種方法來實現這個很好? 乾杯

回答

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)); 
} 
+0

所以我的基類實際上並不需要做任何事情,只需要從中可以獲得所有實際類的東西? – JMzance

+0

@JackMedley,是的。它定義了一個所有被欺騙的類必須實現的接口。 – hmjd

+0

好吧,我已經建立了它,它似乎是好的!大! 另一個相關的事情是:我現在如何訪問派生類中的方法? – JMzance

2

各種

std::unique_ptr<ProcessType> CreateProcess(int input){ 
    if(input == 2) return std::unique_ptr<ProcessType>(new TwoJ()); 
    ..... 
} 

這是假設,當然,前提是你使用的各種類有一個共同的基類,這裏ProcessType,那您滿意通過與它交互的工廠方法基類指針。

+0

'ProcessType'應該由指針(或者更好的智能指針)返回,而不是按值返回,否則您將切片對象。 – syam

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(); 
} 

這個你自己的責任,刪除你的對象一旦它走出去的範圍。 以前的答案是cpp使用std::unique_ptr時最好的方法,當對象超出範圍時,對象會自動刪除。