[c++] Überladen von << Operator

05/01/2011 18:19 Z!ppo#1
Hallo,
ich hab ein Programm, das mittels Objekten einen Binärbaum erstellt.

nun soll ich
Quote:
Überladen Sie den <<-Operator für die Knotenklasse so, dass folgende Ausgabe erzeugt wird, wenn man den Wurzelknoten des von create_complete_tree(2,4) erzeugten Baumes ausgibt:
node_1
node_2
node_3
node_4
node_5
node_6
node_7
Ich hab zwar was zu Überladen von Stream-Operatoren gefunden, hab aber keinen Plan wie ich das anwenden soll.

Also die Einrückung wird mittels einer Membervariable, die die Tiefe des Knotens angibt erzeugt.
05/01/2011 18:55 xNopex#2
Erstmal musst du beachten, dass das Stream-Objekt auf der linken Seite steht. Deswegen kannst du den Ausgabeoperator (<<) nicht als Methode deiner Klasse implementieren. Du musst global arbeiten, mithilfe von friend:

Code:
class MyClass
{
    public:
        friend std::ostream& operator<<(std::ostream&, const MyClass&);
};

std::ostream& operator<<(std::ostream& myStream, const MyClass& my)
{
    return myStream << my.CreateOutput();
}
Aufruf:
Code:
int main()
{
    MyClass obj;
    cout << obj;
}
05/01/2011 19:41 Z!ppo#3
Ok danke erstmal, soweit hatte ich es auch ungefähr dastehen, aber ich weis jetzt nichts genaues damit anzufangen ... wie geb ich denn jetzt was damit aus?
Muss ich das in eine Memberfunktion in MyClass namens CreateOutput schreiben?
05/01/2011 20:06 xNopex#4
Code:
std::ostream& operator<<(std::ostream& myStream, const MyClass& my)
Der zweite Parameter ist ein Objekt deiner Klasse. Arbeitest du mit Zeigern, hast du direkten Zugriff auf das original Objekt:

Code:
std::ostream& operator<<(std::ostream& myStream, MyClass* my)
Nehmen wir an, die MyClass sieht so aus:

Code:
class MyClass
{
    private:
        std::string name;
    public:
        MyClass(std::string);
        friend std::ostream& operator<<(std::ostream&, MyClass*);
};
Dann könntest du so den Namen des Objektes zum Beispiel ausgeben:

Code:
std::ostream& operator<<(std::ostream& stream, MyClass* my)
{
    return stream << my->name;
}
Aufgerufen wird es dann so:

Code:
int main()
{
    MyClass* my = new MyClass("TestObjekt");
    cout << my;
    //...
}
05/01/2011 20:50 Z!ppo#5
Ok soweit klar und klappt alles. Wie kann ich jetzt mehrere Sachen in den Outstream packen, wenn ich z.B. ne return ausgabe hab, wird die Fkt doch danach verlassen oder nicht?

Code:
//tree.cpp
std::ostream& operator<<(std::ostream& myStream, node* obj)
{
   myStream << obj->name << endl;
	for(int x = 0; x< obj->get_nr_children(); x++)
	{
		myStream << obj->get_child(x)->name << endl;
		cout << obj->get_child(x);
	}
}
Code:
//main.cpp
.....
  node* root = new node("root");
  root->create_complete_tree(2,4);
  cout << root;
.....
also die Zeiger der Kindknoten des Baumes werden bei jedem Objekt in nem Vektor namens children gespeichert.

ich glaub aber nich dass ich das wie oben einfach stur aufrufen kann, ich brauch dafür noch ne extra memberfkt oder?

EDIT: habs jetzt fast raus -> funktioniert immer noch nicht, hab die neue memberfkt mal reingeschrieben
05/02/2011 16:00 xNopex#6
Code:
std::ostream& operator<<(std::ostream& stream, node* my_node)
{
    stream << my_node->name << std::endl;
    for(unsigned int i = 0; i < my_node->children.size(); i++)
        std::cout << my_node->children.at(i);
    return stream;
}
Wolltest du es so machen?