c++ Anfänger



  • **funktion.h:
    **
    Code:

    class Value : public Node {
      double value;
    public:
    
      stringc toString() { return(str(value)); 
    };
    

    die Fkt str() ist in einer Header Datei string.h definiert:

    class stringc {		
      char *s;
      int   l;
      char *sep;
      char *tk;
      int   tp;
    public:
      friend stringc str(const double v);
    

    und sowie im Quellcode string.cpp:

    stringc str(const double v)
    {
      char sx[80];
    
      sprintf(sx, "%g", v);
    
      return (stringc)sx;
    }
    

    PS: So wie ich es aus dem Buch entnehmen kann, muss man doch im Header nur den Grundgerüst der Fkt. beschreiben, und die Fkt. selbst kann man doch wo anders definieren oder? und mit friend anweisung sagt man dass die Fkt auf private Eigenschaften der Klasse zugriff hat



  • camper schrieb:

    Eine friend-Deklaration (allein) bewirkt nicht, dass der deklarierte Name im umschließenden Namensraum bei unqualifiziertem Namelookup sichtbar wird. Dazu bedarf es einer zusätzlichen Deklaration in diesem Namensraum. Eine Funktion, die nur per friend deklariert wurde, kann zwar - trotz der fehlenden Sichtbarkeit im Namensraum - per ADNL gefunden werden, aber ein double hat keinen assoziierten Namensraum, der durchsucht werden könnte.

    Das Heisst ich muss die Fkt str() noch mal in der Header Datei string.h deklarieren? Also nur den Grundgerüst? oder kann man irgendwie anders noch auf die Fkt. verweisen?



  • Liest Du unsere Beiträge?

    Ursache:

    LordJaxom schrieb:

    Die Funktion ist in der Headerdatei nicht definiert. Sie ist dort nicht einmal deklariert. Eine friend-Angabe ist nicht automatisch eine Deklaration.

    Lösung:

    LordJaxom schrieb:

    Du musst die Funktion noch einmal vor der Klasse deklarieren.

    Detaillierte Ausführung: siehe camper.



  • Ja ich lese die Beiträge.

    Eine andere Frage, wenn ich die Fkt. vor der Klasse definiere, dann brauche ich doch gar nicht mehr die friend deklaration oder?



  • Das Schlüsselwort friend brauchst du sowieso nur, wenn du von aussen auf ein protected- oder private -Member zugreifen willst, und nicht, um eine Funktion zu deklarieren.



  • bladeexx schrieb:

    Ja ich lese die Beiträge.

    Eine andere Frage, wenn ich die Fkt. vor der Klasse definiere, dann brauche ich doch gar nicht mehr die friend deklaration oder?

    "Non-friends" dürfen allerdings nicht auf non-public-Member zugreifen....
    EDIT: Mal wieder zu spät 😉

    Gruß,

    Simon2.



  • Nur, dass das eine mit dem anderen nichts zu tun hat. Die Deklaration vor der Klasse macht die Funktion gewissermaßen überhaupt erst bekannt, die friend-Deklaration erlaubt der Funktion Zugriff auf private Mitglieder von stringc. Wenn Du das nicht brauchst, kannst Du die friend-Deklaration natürlich weglassen.



  • Ah, ok ich danke euch vielmals!!!! 🙂

    mal eine ganz blöde Frage. Kann ich die Fkt. str() ohne den friend operator in der Klasse deklarieren, oder ist es dann keine Daklaration?



  • Klar kannst du das, nur ist deine Funktion dann eine Memberfunktion der Klasse und keine freie Funktion mehr.



  • bladeexx schrieb:

    mal eine ganz blöde Frage. Kann ich die Fkt. str() ohne den friend operator in der Klasse deklarieren, oder ist es dann keine Daklaration?

    Allmählich bezweifle ich auch, dass du die Beiträge liest... 🙄

    Nochmals: Mit friend deklariert man keine Funktionen, sondern erlaubt den Zugriff von aussen! Das steht übrigens bereits in meinem letzten Post.



  • Braunstein schrieb:

    Klar kannst du das, nur ist deine Funktion dann eine Memberfunktion der Klasse und keine freie Funktion mehr.

    D.h. in meinem Fall könnte ich auch der Klasse Value noch die Klasse Stringc vererben und den friend opeator wegnehme dann müsste auch gehen oder? Oder bringe ich da jetzt was durcheinander?



  • Nexus schrieb:

    Allmählich bezweifle ich auch, dass du die Beiträge liest... 🙄

    Doch ich lese das alles, nur es ist viel neues für mich und ich will und versuche es zu verstehen, sry dass es bei mir nicht sofort ankommt und ich vieles nachfragen muss 😞



  • Sry dass ich euch damit nerve, aber eine Frage, mir wurde gesagt, dass der Code früher mit Solaris System Compiliert wurde und es lief. Kann es sein dass sich Kompiler so geändert haben, oder liegt hier ein allgemeiner c++ Fehler vor?


  • Mod

    bladeexx schrieb:

    Sry dass ich euch damit nerve, aber eine Frage, mir wurde gesagt, dass der Code früher mit Solaris System Compiliert wurde und es lief. Kann es sein dass sich Kompiler so geändert haben, oder liegt hier ein allgemeiner c++ Fehler vor?

    In Prä-Standard C++ wurden Namen aus friend-Deklarationen unmittelbar im umliegenden Namensraum sichtbar - insofern hat sich hier die Sprache verändert.



  • Ok.

    Danke euch allen nochmals


Anmelden zum Antworten