私は、このツリー構造を持っている:C++デストラクタ
public:
node(string& const n);
virtual ~node();
string get_name() const;
void set_name(string& new_name);
int get_nr_children() const;
node get_child(int i) const;
void add_child(node child);
private:
string& name;
vector<node> children;
};
と私のmain.cppには、次のようになります。
int main() {
string s = "root";
node r(s);
string s2 = "left child";
node ls(s2);
string s3 = "right child";
node rs(s3);
r.add_child(ls);
r.add_child(rs);
r.~node();
}
(私は~node()
がでとにかくすべてのオブジェクト上で実行されていることを知っていますmain
funcitonの終わりですが、最初にルートr
で実行されていることを確認します)
すべてのメソッドはこれまでうまくいきますeデストラクタ。これは私の最初のデストラクタであり、次の再帰的なtryを思いついたが、なぜうまくいかないのか分からない。
node::~node() {
cout << "Enter ~node of " << this->get_name() << endl;
while (this->get_nr_children() != 0) {
this->get_child(0).~node();
this->children.pop_back();
}
delete this;
cout << "Leave ~node of " << this->get_name() << endl;
}
結果は「左の子の〜ノードを入力します」
_'lele this; '_hh?それはまったく間違っている! –
デストラクタを直接呼び出しません*。代わりに 'delete'を使用してください(より良いことに、コンテナまたはスマートポインタを使用する方が良い)。 – crashmstr
'add_child'が私たちが提供できるのは投機です。 [mcve]を作る。また、 'delete'の直後に' this'にアクセスします。 – nwp