Ich habe diese Baumstruktur:C++ destructor für Baumstruktur
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;
};
und meine main.cpp sieht wie folgt aus:
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();
}
(Ich weiß, dass ~node()
auf alle Objekte in der ohnehin läuft Ende der main
funciton, aber ich möchte sicherstellen, dass es auf der Wurzel r
zuerst ausgeführt wird)
Alle Methoden funktionieren soweit, bis auf th e Destruktor. Dies ist mein erster Destruktor, und ich kam zu dem folgenden rekursiven Versuch, weiß aber nicht, warum es nicht funktioniert.
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;
}
Das Ergebnis ist eine endlose Ausgabe von „Enter ~ Knoten von links Kind“
_delete dies; '_ Huh ???? Das ist eklatant falsch! –
Rufen Sie Destruktoren nicht direkt auf. Stattdessen benutze 'delete' (besser noch: benutze Container oder Smart Pointer). – crashmstr
Ohne zu sehen, was "add_child" alles bietet, was wir anbieten können, ist Spekulation. Mach ein [mcve]. Sie greifen auch direkt nach dem Löschen auf diese Datei zu. – nwp