Instanzmethode als friend deklarieren
-
Hallo,
ich habe in einem Header-File folgenden Code:
... class To_Dot_Str_Visitor; // Zeile 23 ... class Prob_Nd : public virtual Rev_Nd, public virtual Base_Nd<Rev_Nd, Rev_NC, Rev_Tree> { friend void To_Dot_Str_Visitor::_visit(Rev_Nd* n); // Zeile 122 ... }Beim kompilieren erhalte ich nun die Fehlermeldung
../src/node/nd.h:122: Fehler: invalid use of incomplete type »struct To_Dot_Str_Visitor« ../src/node/nd.h:23: Fehler: forward declaration of »struct To_Dot_Str_Visitor«Von daher die Frage: Gibt es hier andere Loesungsmoeglichkeiten als
- To_Dot_Str_Visitor als friend von Prob_Nd zu deklarieren
- die Definition von To_Dot_Str_Visitor einzubinden
?
Und im uebrigen: Warum braucht der Kompiler hier ueberhaupt den vollstaendigen Typ von To_Dot_Str_Visitor? Die Groesse von Prob_Nd laesst sich ja auch ohne dieses Wissens bestimmen?
-
Woher soll der Kompiler die friend-Funktion kennen. Aus der Forward-Deklaration sicher nicht. Die kann man nur benutzen, wenn man mit Zeiger oder Referenzen hantiert, aber keine "Interna" braucht. Ein #include "To_Dot_Str_Visitor.h" sollte abhilfe schaffen.
die Definition von To_Dot_Str_Visitor einzubinden
Du hast nichts definiert, nur deklariert. Deswegen ist der Typ auch unvollstaendig.
-
was hat
void To_Dot_Str_Visitor::_visit(Rev_Nd* n);in den Eingeweiden von Prob_Nd zu schaffen?
-
pumuckl schrieb:
was hat
void To_Dot_Str_Visitor::_visit(Rev_Nd* n);in den Eingeweiden von Prob_Nd zu schaffen?Es handelt sich dabei um eine Ausgabe-Funktion. Da sie Interna von Prob_Nd ausgeben soll (auf die ordinaere Funktionen keinen Zugriff haben), habe ich das mittels friend realisiert (so wie ich gewoehnlich auch den <<-Operator als friend deklariere).
-
ingobulla schrieb:
pumuckl schrieb:
was hat
void To_Dot_Str_Visitor::_visit(Rev_Nd* n);in den Eingeweiden von Prob_Nd zu schaffen?Es handelt sich dabei um eine Ausgabe-Funktion. Da sie Interna von Prob_Nd ausgeben soll (auf die ordinaere Funktionen keinen Zugriff haben), habe ich das mittels friend realisiert (so wie ich gewoehnlich auch den <<-Operator als friend deklariere).
Ahso, wunderte mich nur weil ein Rev_Nd* als Parameter übergeben wurde und kein Prob_Nd*.
Da friends die stärkste Bindung sind die es in C++ gibt und der op<< meist nicht Zugriff auf alle privaten Member braucht löse ich das meist so:
class X { public: ostream& print(ostream& os) const { /* output */ return os; } }; std::ostream& operator<< (std::ostream& os, X const& rhs) { return rhs.print(os); }bzw. mit einem kleinen vorgefertigten Template:
//printable.hpp #include <iosfwd> template <class T> struct printable { friend std::ostream& operator<< (std::ostream& os, T const& t) { return t.print(os); } }; //X.hpp #include "printable.hpp" class X : printable<X> { public: ostream& print(ostream& os) const { /* output */ return os; } };