2015-11-06 106 views
0

有沒有辦法在不使用模板的情況下從該類創建類的實例? 我需要做somethink像 static classobj* classobj::create(){return new this;}在C++中創建「對象的新實例」方法

現在我用類模板,並傳遞給模板類型一樣創建類的:

template<class T> 
class basic_class { 
    public: 
    static T *create(int param) { return new T(param); } 
} 

class A : public basic_class<A> {} 
+0

爲什麼你要做到這一點,而無需使用模板? –

+0

我認爲我們需要更好地理解「從這堂課」到底是什麼意思。在編譯時,這個類已經在那裏了。在運行時,沒有類對象(與Java相反)。 –

回答

1

如果我正確理解你的問題,那麼你必須添加靜態創建的每一個類:

class A 
{ 
public: 
    //to create 
    static A* create(int param) { return new A(param); } 
}; 

和那麼這樣做:

A* ptr = A::create(4); 

或更好,避免了內存泄漏

std::unique_ptr<A> uptr(A::create(4)); 

或者,如果你的問題是做一個「聰明」的basic_class任何構造函數創建,然後做在C++ 11:

template <class T> 
class base_class 
{ 
public: 
    template<typename... Params> 
    static T* construct(Params&&... parameters) { return new T(std::forward<Params>(parameters)...); } 
}; 

class A : public base_class<A> 
{ 
public: 
    A(const std::string& s) {} 
    A(int i) {} 
}; 

A::create(std::string("Hey")); 
A::create(5); 
現在

都工作。

編輯:基類定義了「結構」方法。所以上面的應該是

A::construct(std::string("Hey")); 
A::construct(5); 
5

爲什麼不呢?

return new classobj; 

或者這樣:

return new decltype(*this); 

但請不要這樣做的。您的函數返回的指針具有不明確的所有權語義。我們現在通常不需要生指針。

+0

當然可以!我簡化了示例以便更容易理解。 第二種解決方案是否適用於類的繼承者?這個方法是否會創建類obj來定義那個函數或它的繼承者? – Dcow

+0

哪個方法的簽名應該是? – Dcow

+0

以及如何結合「靜態」? – Dcow

1

實現一個拷貝構造函數首先

classobj(const classobj& obj); 

然後

return new classobj(*this) 
2

如果我正確理解你的問題,你想創建一個非模板類是這樣的:

class Base 
{ 
public: 
    static (Magic)* create() { return new (Magic); } 
} 

我們會再調用這個方法正是如此:

class Derived : public Base {}; 

Derived* object = Derived::create(); 

問題是:我們用什麼咒語替代「(魔術)?」不幸的是,沒有這樣的語法。靜態類方法就像常規函數一樣。所有涉及的類型都必須在聲明該函數時已知。

你能詳細說明爲什麼你不想使用模板?也許還有另一種方法來解決你的問題。