Binär Baum als Template
-
Also hier erstmal der Code:
template < class DType > class TREENODE { public: TREENODE (DType t); ~TREENODE (); DType &getElement(); TREENODE<DType> &getLeft(); TREENODE<DType> &getRight(); void setLeft (TREENODE<DType>* number); void setRight (TREENODE<DType>* number); protected: DType data; TREENODE<DType>* left; TREENODE<DType>* right; };
Das ganze ist eine Knotenklasse für einen Binärbaum. In diesem sollen später Formeln gespeichert werden. Der Baum wird rekursiv aufgebaut. Das Problem ist nun das left und right nicht den gleichen DType wie das Objekt selbst haben müssen. Da der Compiler aber DType ja setzt ist nun meine Frage wie ich das variabel gestalten kann. Hab schon ne Menge probiert aber irgendwie hat nichts geklappt. Hoffe das Problem wurde verstanden und würde mich über jeden Lösungsvorschlag freuen.
-
templates sind statische Polymorphie - DType muss immer der selbe Typ sein.
Am einfachsten du speicherst nur abgeleitete Klassen in dem Baum - so wie du es auch bei einem std Container machen würdest.Wirklich 'dynamische' Typen gehen nicht, man kann sie nur mit Mühe und Not simulieren - aber dann ist die Syntax nicht mehr intuitiv verwendbar (wenn es überhaupt geht - das kommt immer auf den Anwendungsfall an)
-
Naja das Problem bei abgeleiteteten Klassen wäre ja das ich für jede Möglichkeit ne eigne Klasse bauen müßte, aber wenns nicht anders geht soll es wohl so sein.
-
Naja, grundverschiedene Typen zu speichern macht ja auch nicht wirklich Sinn, oder ?;)
-
Doch macht Sinn, wenn ich als Wurzel nen Operator hab (char) und die Blätter wären dann Zahlen (int, float,...). Aber als Blätter kann ich ja wieder Operatoren haben, etc. Also gibts ne Menge Möglichkeiten, deshalb wollt ichs nach Möglichkeit dynamisch halten.
-
Diese Objekte sind nicht grundverschieden, sie >sind< Zahlen.
Im Übrigen wird es doch wohl ausreichen, (long) double zu nehmen, eh?MfG Eisflamme
-
Hmm ja das hab ich mir eben auch überlegt, dann werd ich mir wohl noch dazuschreiben um was es sich handelt und ne convert function schreiben. Mal sehn ob das so klappt.
-
conert-Funktion?
Wenn man an double 0 übergibt ist das zwar nicht sonderlich schön, aber auch net schlimm, außerdem wirst du die Werte ja für Rechnungen wohl aus Strings einlesen und 0 wird er mit stringstream schon ordentlich nach double verfrachtet bekommen.
-
hmm geht nich um die int werte die brauch ich nicht konvertieren aber die char werte oder etwa nich?
-
Stimmt:
#include <iostream> #include <fstream> using namespace std; int main() { std::ifstream ifs("H:/foo.txt"); double test; ifs >> test; std::cout << test << std::endl; return 0; }
foo.txt schrieb:
h
gibt 0 aus.
MfG Eisflamme
-
Ich würde einfach eine Klasse schreiben, die ein Token repräsentiert. Wobei dieses Token intern ein double, ein Foo oder sonstwas sein kann.
Wenn man das Token auswertet - dann geschehen unterschiedliche Sachen.so würde ein * die zwei child knoten nehmen, auswerten und multiplizieren.
-
lies die chars doch einfach als int aus