2015-11-09 61 views
0

例如,我有不同的容器類來保存MyClass的對象通過new操作符創建:是否可以重寫MyClass *(不是MyClass)的析構函數?

class A{ 
    MyClass* m; 
    vector<MyClass*> vm; 
    vector<vector<MyClass> > vvm; 
    pair<int,MyClass*> pim; 
}; 

我想刪除一個所有MyClass的對象時,A被破壞,是可以覆蓋的析構函數MyClass的*,如:

~MyClass*(){ 
    delete *this; 
} 

,以取代自定義的析構函數:

~A(){ 
    delete m; 
    for(MyClass* m : this->vm){ 
     delete m; 
    } 
    for(vector<MyClass*> vm : this->vvm){ 
     for(MyClass* m : this->vm){ 
      delete m; 
     } 
    } 
    delete pim.second; 
} 

使我無需添加新的代碼時,O型f容器被添加來保存MyClass的引用?

+1

如果你使用'std :: share_ptr ',你可以使用'A ::〜A(){}'。 –

+1

你打敗了我R Sahu。雖然不是'std :: shared_ptr '? – CommanderBubble

+0

@CommanderBubble,是的'shared_ptr'。 –

回答

2

如果您可以自由使用std::shared_ptr<MyClass>而不是原始指針,則可以簡化A的析構函數。

class A { 

    public: 
     ~A() {} // That's all you need. You can even omit it. 

    private: 
     std::shared_ptr<MyClass> m; 
     vector<std::shared_ptr<MyClass>> vm; 
     vector<vector<MyClass> > vvm; 
     pair<int,std::shared_ptr<MyClass>> pim; 

}; 
+1

請注意,提供一個顯式析構函數會抑制隱式移動構造函數和移動賦值運算符的生成,所以如果您確實需要這些函數,那麼您最好省略析構函數 –

0

MyClass的一個實例是在外部創建的,並且您希望在刪除A的實例時刪除MyClass的實例?

如果MyClass的實例的生命週期依賴於A,那麼就

類A {
私人:
MyClass的米;
}

或者如果沒有,則刪除外部的MyClass實例。

相關問題