2011-05-17 134 views
4

可以請你告訴我是否可以手動調用對象構造函數?我知道這是錯誤的,我永遠不會在自己的代碼中做這樣的事情,我知道我可以通過創建和調用初始化函數來解決這個問題,但問題是我偶然發現了一個情況,其中有成千上萬行代碼對象及其父母的建設者......手動對象構造函數調用

class MyClass() 
{ 
    MyClass() { } 
    virtual ~MyClass(); 

    void reset() 
    { 
     this->~MyClass(); 
     this->MyClass::MyClass(); //error: Invalid use of MyClass 
    } 
}; 
+7

如果在任何函數中有成千上萬行代碼,那麼某處某處是非常錯誤的。 – 2011-05-17 14:18:30

回答

5

您仍然可以將構建/銷燬移動到不同的功能中,並直接調用這些功能。即

class MyClass { 
public: 
    MyClass() { construct(); } 
    ~MyClass() { destruct(); } 

    void reset() { 
     destruct(); 
     construct(); 
    } 

private: 
    void construct() { 
     // lots of code 
    } 

    void destruct() { 
     // lots of code 
    } 
}; 
+0

+1最乾淨的方式。 – iammilind 2011-05-17 13:47:10

+0

非常感謝大家!我不相信我可能錯過了這個解決方案...... – Ryan 2011-05-17 13:53:24

3

你可以使用放置新的語法:

this->~MyClass(); // destroy 
new(this) CMyClass(); // construct at the same address 
2

構造函數使用放置新的名爲

new (address) MyClass(); 

這在地址的空白處構造一個MyClass。

絕對不會這樣做裏面的這個班雖然!

編輯
如果你已經有了正確類型的對象,並希望爲其指定默認值,另一種是

*this = MyClass(); 

這將創建默認值的新對象,並指定該值到您現有的對象。

+0

嗯,這當然是一個解決方案,但它會導致內存泄漏... – Ryan 2011-05-17 13:38:24

+0

問題是,MyClass總是在堆棧上創建 – Ryan 2011-05-17 13:39:05

+0

@Ryan:如果你這樣做@sharptooth顯示,那麼它將沒有內存泄漏,因爲你已經有了記憶。 – Xeo 2011-05-17 13:41:40

相關問題