2017-10-14 81 views
0

如果我有一個派生類的基類,是否有可能創建實例作爲低音或派生類依賴傳遞給單個構造函數的參數?C++可以創建派生而不是低音類依賴於給單個構造函數的參數嗎?

例如代碼:

//Base Class 
class MyClass { 
public: 
    //All instances created with this constructor 
    MyClass(int param1, int param2) { 
    if (param1 > param2) { //(for example) 
     // TODO - create this object as SubClass instead 
    } else { 
     //normal base class construction 
    } 
    } 
} 

//Derived Class 
class SubClass { 
public: 
    SubClass(int param1, int param2) { 
    //Subclass construction 
    } 

    void function() { 
    //function that only works on subclass objects 
    } 
} 

MyClass object1(1, 2); //should create MyClass object 
MyClass object2(2, 1); //should create SubClass object 

如上所示,創建這個類的一個實例時,我想構造要麼功能正常,使類,或(取決於給定爲參數的值)使其成爲派生子類的一個實例。請注意,它必須基於不同參數的值,而不僅僅是它們的類型。是否有可能做到這一點?如果有必要的話,只要有一個構造函數必須被使用,它就會有另一個派生類來表示'normal'選項(而不是使用純低音類)。

如果這是不可能的,我可以只需調用子類構造函數時,我想這方面的一個例子,但是這並不理想,因爲我會檢查哪一個應該每一個被創建時被創建,而而不僅僅是在構造函數中進行一次內部檢查。

+2

這是工廠設計模式是,你傳遞的參數爲工廠創建,並返回要麼MyClass的或基於參數的子類。 – mnistic

回答

1

您可以委託創作到MyClass靜態函數:

class SubClass; 

//Base Class 
class MyClass { 
    MyClass(int param1, int param2) { 
    } 
public: 
    static unique_ptr<MyClass> Create(int param1, int param2) { 
    if (param1 > param2) { //(for example) 
     return std::make_unique<SubClass>(param,param2); 
    } else { 
     return std::make_unique<MyClass>(param,param2); 
    } 
    } 
} 

//Derived Class 
class SubClass : public MyClass { 
    SubClass(int param1, int param2) { 
    //Subclass construction 
    } 
public: 

    void function() { 
    //function that only works on subclass objects 
    } 
} 

std::unique_ptr<MyClass> object1 = MyClass::Create(1, 2); //should create MyClass object 
std::unique_ptr<MyClass> object1 = MyClass::Create(2, 1); //should create SubClass object 
+0

太棒了!有什麼辦法可以使構造默認爲靜態方法嗎?假設沒有,我可以拋出一個異常,每當構造函數被調用(除非通過靜態方法),以強制使用靜態方法? – ZSmith

相關問題