006
30.08.2005, 13:56 Uhr
virtual
Sexiest Bit alive (Operator)
|
Also, reinen Compilerfehler kann ich hier erstmal nicht feststellen.. Aber der Code ist dennoch äußerst Problematisch:
C++: |
class Node { private: T Value; std::vector<Node* > SubNodes;
|
Diese Deklaration bedeutet, daß du den Vector nachher selbst freigeben mußt, denn Node* Objekte haben keinen Destruktor, den haben nur Node Objekte. Das wäre erstmal nicht weiter tragisch: da du kein remNode hast, bräuchtest Du nur den Destruktor von Node anzupassen. Richtig ärgerlich wird es aber hier:
C++: |
template<class T> void Node<T>::addNode(Node NodeToAdd) { SubNodes.push_back(&NodeToAdd); }
|
Hier tust du einen Pointer auf eine lockale Variable (nämlich NodeToAdd) in den Vector. Das wird mit an sicherheit grenzender Wahrscheinlichkeit zum Absturz führen
Was ich halt generell aussetzen würde: du arbeistet mit vector<Node*>, weil Du wohl hoffst, ein wenig Performance zu gewinnen, um nur Pointer zu kopieren. Das wird aber konterkariert, indem Du niemals ernsthaft mit Referenzen arbeitst, sondern Nodeobjekte bei der parameterübergabe munter hin+her kopierst.
Du wirst mit diesem Code keine Freude haben, auch wenn er kompiliert. Tu dir im ersten Schritt den Gefallen, die Sache umschreiben in:
C++: |
template<class T> class Node { private: T Value; std::vector<Node> SubNodes; public: void setValue(T newValue); T getValue(); Node<T> operator [](int index); void addNode(Node NodeToAdd);
Node(); virtual ~Node(); };
//implementation
template<class T> void Node<T>::setValue(const T& newValue) { Value = newValue; }
template<class T> const T& Node<T>::getValue() const { return Value; }
template<class T> T& Node<T>::getValue() { return Value; }
template<class T> const Node<T>& Node<T>::operator[] (int index) const { return *SubNodes[index]; }
template<class T> Node<T>& Node<T>::operator[] (int index) { return *SubNodes[index]; }
template<class T> void Node<T>::addNode(const Node& NodeToAdd) { SubNodes.push_back(NodeToAdd); } };
|
-- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |