2017-06-12 8 views
0

にベクトルに派生クラスのデストラクタを呼び出すためにはどのように異なるの派生クラスを持つ基底クラスへのポインタのstd::vectorを持つクラスを持っています。 vectorクラスからデストラクタを呼び出すにはどうすればよいですか?あなたは私が間違ってやっている知っていれば別のクラス

holder.h

class holder 
{ 
public: 
    void add_stuff(); 
    void do_stuff();   
private: 
    std::vector<base*> vect; 
}; 

holder.cpp

void holder::add_stuff(base* to_add) { 
    vect.push_back(to_add); 
} 

void holder::do_stuff() { 
    vect[0]->say_words(); 
    delete vect[0]; //<--<--<-- I want to delete the object now 
} 

は現在停止気軽に。私はちょうど途方もない場合に備えて、コードの残りの部分の基本を含めました。

base.h

class base 
{ 
public: 
    base(); 
    virtual ~base(); 
    virtual void say_words() = 0; 
}; 

derived.h

class derived : public base 
{ 
public: 
    derived(); 
    ~derived(); 
    void say_words(); 
}; 

derived.cpp

derived::derived() {} 
derived::~derived() {} 

void derived::say_words() { 
    cout << "Words!" << endl; 
} 

main.cppに

holder hold; 
holder* H = &hold; 
int main(){ 
    base* d = new derived(); 
    H->add_stuff(d); 
    H->do_stuff(); 
} 
+13

ないでください。生のポインタの代わりに 'のstd :: unique_ptr'または'のstd :: shard_ptr'を使用して、削除するために、ベクターに 'erase'を使用しています。それはあなたのメモリ管理を処理します(それは良いことです)。 – NathanOliver

+3

疑似コードを送信しないでください。投稿[MCVE]。 – Yakk

+0

コード内のこの正確な時点でオブジェクトを破壊する実質的な制約は何ですか? – PerelMan

答えて

0

どのように私はvectorクラスの中から自分のデストラクタを呼ぶのですか?

~baseデストラクタはvirtualとマークされています。基本クラスへのポインタにdeleteを呼び出すと、派生したすべてのデストラクタが自動的に呼び出されます。基底クラスのデストラクタが最初の場所でvirtualとして宣言する必要が理由です。あなたが不足している何

は、しかし、例えば、あなたdeleteオブジェクトの後にあなたのstd::vectorからオブジェクトポインタを削除します

void holder::do_stuff() { 
    vect[0]->say_words(); 
    delete vect[0]; // <-- calls all destructors of this object! 
    vect.erase(vect.begin()); // <-- add this line! 
} 

あなたのコンテナに無効なポインタを残したくありません。