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;
      }
    };
    

Anmelden zum Antworten