Probleme mit der friend Funktion



  • Hallo. ich versuche wieder seit tagen ein programm zum laufen zu bringen:

    Das ist meine Headerdatei:

    class Date
    {
    protected:
    int day, month, year;
    public:
    Date(int d, int m, int y)
    {
    day=d;
    month=m;
    year=y;
    }
    friend ostream &operator<<(ostream &os, const Date &dt);
    };

    von meiner main wollte ich dann wie folgt ausgeben:
    ...

    ostream &operator<<(ostream &os, const GermanDate &dt)
    {
    return (os <<"Datum "<<':' << dt.day <<'/'<<dt.month<<'/' <<dt.year<<endl);

    }

    ...
    der compiler meckert aber ständig:
    F:\C++\Jesosky\Gerdate\date\gerdate.cpp(18) : error C2248: 'day' : cannot access protected member declared in class 'Date'
    usw.
    über die friend Funktion müsste das doch gehen oder?????????????



  • Der Parameter dt in deinem operator << ist allerdings nicht vom Typ 'Date' sondern 'GermanDate'.



  • Oh ja..Sorry.
    Nur falsch rauskopiert. das Problem bleibt aber trotzdem 😕



  • Hast du da eine using-Direktive in deiner Headerdatei?



  • Ja habe ich.

    #include<iostream>
    using namespace std;



  • mark79 schrieb:

    Ja habe ich.

    Dann nimm die mal raus. Abgesehen davon, dass man so etwas in Headerdateien sowieso nicht tun sollte, glaube ich mich an einen Bug in VC6 zu erinnern, der bei eben solchen Direktiven im Zusammenhang mit friend-Operatoren auftrat.



  • also habs rausgenommen. hab aber trotzdem die selben Fehlermeldungen.
    könnte es sein das der Konstruktor von mir nicht ganz so passend ist???



  • Hi,

    also bei mir läuft der Code.
    Ich denke, bei Dir liegt der Fehler woanders....

    #include <iostream>
    
    class Date {
    protected:
    	int day, month, year;
    public:
    	Date(int d, int m, int y) {day=d;month=m;year=y;}
    	friend std::ostream &operator<<(std::ostream &os, const Date &dt);
    };
    
    std::ostream &operator<<(std::ostream &os, const Date &dt) {
    	return (os <<"Datum "<<':' << dt.day <<'/'<<dt.month<<'/' <<dt.year<<std::endl);
    }
    
    int main()
    {
    	Date d(1, 2, 3);
    	std::cout << d << "\n";
       return 0;
    }
    

    Gruß,

    Simon2.



  • also das geht leider auch nicht, ich setz mal mein komplettes prog. rein.
    sind 2 header und 2 main. das eine main programm ist ein vorgegebenes testprogramm.

    #ifndef GermanDate_HPP
    #define GermanDate_HPP

    class GermanDate:public Date{
    private:
    static bool longFormat;
    public:
    GermanDate( int d, int m, int y):Date(d,m,y) {}

    static void setLongFormat(bool format = true) {longFormat = format;}

    friend ostream &operator<<(ostream &os, const GermanDate &gd);
    };

    #endif // GermanDate_HPP

    ......................................................
    #ifndef DATE_HPP
    #define DATE_HPP

    class Date
    {
    protected:
    int day, month, year;
    public:
    Date(int d, int m, int y)
    {
    day=d;
    month=m;
    year=y;
    };
    friend ostream &operator<<(ostream &os, const Date &dt);
    };
    #endif // DATE_HPP
    ...............................................
    /*--- #includes der Form <...> ---------------------------------------*/

    #include <iostream>
    using namespace std;

    /*--- #includes der Form "..." ---------------------------------------*/

    #include "date.hpp"
    #include "gerdate.hpp"

    int main(void)
    {
    GermanDate gd(27, 11, 1999);
    const GermanDate cgd(gd);
    Date d(gd);
    const Date cd(d);

    cout << "Datum: " << d << endl;
    cout << "Datum: " << cd << endl;

    cout << "Datum (Kurzform): " << gd << endl;
    cout << "Datum (Kurzform): " << cgd << endl;
    GermanDate::setLongFormat();
    cout << "Datum (Langform): " << gd << endl;
    cout << "Datum (Langform): " << cgd << endl;
    }

    /* Ausgabe:
    ------------------------------------------------------------------------
    Datum: 11/27/1999
    Datum: 11/27/1999
    Datum (Kurzform): 27.11.1999
    Datum (Kurzform): 27.11.1999
    Datum (Langform): 27. November 1999
    Datum (Langform): 27. November 1999
    ----------------------------------------------------------------------*/

    ....................................................

    #include <iostream>

    using namespace std;

    /*--- #includes der Form "..." ---------------------------------------*/

    #include "date.hpp"
    #include "gerdate.hpp"

    ostream &operator<<(ostream &os, const Date &dt)
    {
    return os <<"Datum "<<':' << dt.day <<'/'<<dt.month<<'/' <<dt.year<<endl;

    }
    ostream &operator<<(ostream &os, const GermanDate &gd)
    {
    if (gd.longFormat==false)
    return (os <<"Datum "<<':' <<gd.day<<'.'<<gd.month<<'.' gd.year<<endl);
    else
    return (os <<"Datum "<<':' <<gd.day<<'.'<<"November"<<'.' gd.year<<endl);
    }
    bool GermanDate::longFormat=false;

    im vorraus schon mal danke für jede Hilfe 🙂



  • Wenn using namespace std; vor den Includedirektiven für deine eigenen Headerdateien steht, hat das denselben Effekt, als würde es in diesen Dateien stehen.

    Du musst die using-Direktive hinter die Includedirektiven für deine Header stellen (und natürlich dann im Header überall std::ostream schreiben).



  • Hi,

    also bei mir läuft das.

    (bis auf einen Tippfehler bei Dir: zwei fehlende "<<" in

    mark79 schrieb:

    ostream &operator<<(ostream &os, const GermanDate &gd)
    {
    	if (gd.longFormat==false)
    	return (os <<"Datum "<<':' <<gd.day<<'.'<<gd.month<<'.' [u]<<[/u] gd.year<<endl);
    	else
    	return (os <<"Datum "<<':' <<gd.day<<'.'<<"November"<<'.' [u]<<[/u] gd.year<<endl);
    }
    

    und ein "return 0;" im main)

    Allerdings finde ich keine "... 2 mains ...", sondern nur ein main und eine Implementierung der "operator<<()'s" ....

    Meine Struktur:
    - 2 Includes: Date.h, GermanDate.h
    - 2 cpps: main.cpp, DateStreams.cpp

    Da habe ich nur Deinen Code reinkopiert und schon tuts (g++ (GCC) 3.4.4 und VC++ 6.0) .

    Gruß,

    Simon2.



  • Also, erst mal danke für die hilfe. jetzt klappt alles. hatte danach noch einen fehler...
    hab ewig gesucht:
    f (gd.longFormat==false)
    return (os <<"Datum "<<':' <<gd.day<<'.'<<gd.month<<'.' gd.year<<endl);
    else
    return (os <<"Datum "<<':' <<gd.day<<'.'<<"November"<<'.' gd.year<<endl);
    }

    -> <<vor gd.year 😡


Anmelden zum Antworten