Problem mit Überladung von operator<<



  • #include <iostream>
    #include "Date.h"
    
    using namespace std;
    
    int main(void)
    {
       Date today;
       today.Set(18, 3, 2005);
       system("PAUSE");
       return 0;
    }
    
    #ifndef DATE_H
    #define DATE_H
    
    #include <iostream>
    
    class Date
    {
       public:
       Date();
       ~Date();
       friend ostream& operator<<(ostream&, const Date&);
       void Set(int, int, int);
    
       private:
       int day;
       int month;
       int year;
    };
    
    #endif
    
    #include <iostream>
    #include "Date.h"
    
    using namespace std;
    
    Date::Date()
    {
    }
    
    Date::~Date()
    {
    }
    
    ostream& Date::operator<<(ostream& os, const Date& d)
    {
       os << d.day << "." << d.month << "." << d.year;
       return os;
    }
    
    void Date::Set(int day, int month, int year)
    {
       this->day = day;
       this->month = month;
       this->year = year;
    }
    

    Ich benutze DevC++ 4.9.9.2 (GCC 3.4.2) und erhalte als Fehlermeldung:
    Compiler: Default compiler
    Building Makefile: "C:\Test\Makefile.win"
    Führt make clean aus
    rm -f main.o Date.o Test.exe

    g++.exe -c main.cpp -o main.o -I"lib/gcc/mingw32/3.4.2/include" -I"include/c++/3.4.2/backward" -I"include/c++/3.4.2/mingw32" -I"include/c++/3.4.2" -I"include"

    In file included from main.cpp:2:
    Date.h:11: error: ISO C++ forbids declaration of ostream' with no type Date.h:11: error:ostream' is neither function nor member function; cannot be declared friend
    Date.h:11: error: expected `;' before '&' token

    make.exe: *** [main.o] Error 1

    Ausführung beendet

    Was ist da denn los? Ich hab zwar in verschiedenen Tutorien leicht verschiedene Varianten gesehen (z. B. Rückgabe nur als ostream), aber mit der Fehlermeldung komme ich nicht klar.



  • Hi,

    deine Funktion ist als friend deklariert, aber wird in der Klasse definiert. Das musst du außerhalb machen, dann klappts auch mit Friend.



  • Außerhalb der Klasse?! Aber der Operator ist doch auch rein logisch an die Klasse gebunden, weil er ja für Objekte dieser Klasse gelten soll 😕



  • Hi,

    ja, aber das ist er ja bereits weil er ein Objekt dieser Klasse als Parameter erwartet.

    EDIT: Die andere Möglichkeit wäre eben, das ohne Friend zu machen, dann darf der operator<< aber nur einen Parameter haben.



  • Ich bin jetzt völlig verdutzt. Auf http://www.cpp-tutor.de/cpp/le12/le12_05.htm#ausgabe_op z. B. wird der Operator doch auch IN der Klasse definiert und als friend deklariert. Warum soll das da richtig sein und bei mir falsch? Oder ist das Tutorial fehlerhaft? Auch in diversen Uni-Skripten zum Thema C++ wird der <<-Operator in der Klasse als friend definiert.



  • Hä? Es ist genau andersherum. Wir deklarieren in der Klasse die Funktion als friend und definieren sie außerhalb...
    Vielleicht solltest du dir mal das hier ansehen...



  • Hi,

    wird der Operator doch auch IN der Klasse definiert und als friend deklariert.

    noe, wird er eben nicht.

    [cpp]
    class Complex
    {
    double real;
    double imag;
    public:
    ....
    // Hier wird in der Klasse gesagt, dass die Funktion mit eben genau
    // dieser Signatur als friend auf die Klassenelemente zugreifen darf...
    friend ostream& operator <<
    (ostream& os, Complex *pOp);
    };

    // Funktionsdefinition
    // Hier wird, außerhalb der Klasse, die Funktion definiert.
    // Es steht kein complex:: davor. Dass die Funktion zur Klasse gehört, wird
    // durch den Parameter Complex *pOp deutlich gemacht.
    ostream& operator << (ostream& os,
    Complex *pOp)
    {
    os << pOp->real;
    os << pOp->imag;
    return os;
    }
    [/cpp]


Anmelden zum Antworten