Class und keinen Durchblick



  • Hallo,
    Ich muss für die Uni mein Final project schreiben und habe dafür 8 stunden Zeit und im moment komme ich einfach mal gar nicht weiter und hoffe auf eure Hilfe:
    Ich soll eine class date schreiben mit 3 int. Diese sollen für alle child classe zugänglich sein und da sind verschiede public funtions. Setmonth, Getmonth, Setday, Getday und setyear und setyear. Dann soll es einen Default (leeren) constructor haben und einen Constructor mit 3 argumentent. Dann noch einen Copy Constructor und Assignment Overload und zu aller letzte eine public function print die year, month und day anzeigt. Ok so weit so gut.
    So weit bin ich gekommen: Ich habe probleme mit dem Copy Constructor und der Print datei:

    ifndef Date_h
    #define Date_h
    
    class Date
    {
          protected:
                    int day;
                    int month;
                    int year;
    
          public: // Default Constructor
                 Date:: Date ()
                 {
                        }
                  // constructor with 3 arg
                  Date:: (int d, int m, int y)
                  { day = d; month = m; year = y }
    
                  // Copy Constructor
    
                  // Assignment operator
    
                  void operator 
                  Date operator = ( Date & r)
                  { day = r.day;
                    month = r.month;
                    year= r. month;
                    return * this;
                    }
                 int getday ()
                 {return day}
    
                 int getmonth ()
                 {return month}
    
                 int getyear ()
                 { return year}
    
                 void setday (int)
    
                 void setyear (int)
    
                 void setmonth (int)
    
                 void Date:: setday (int dy)
                 { day = dy}
    
                 void Date:: setyear (int yr)
                 { year = yr)
    
                 void Date:: setmonth (int mo)
                 { month = mo}
    

    Vielen vielen dank für euere Hilfe



  • Playmuckel schrieb:

    Ich habe probleme mit dem Copy Constructor und der Print datei:

    Und welche Probleme?

    Als Ansatz: Der Copy Constructor sollte so aussehen:

    Date( Date const& r )
    

    Und die Print-Funktion ist nun wirklich nicht schwer. Sie gibt nichts zurück, nimmt nichts an, und enthält in etwa drei cout-Statements.



  • Für so eine Klasse brauchst Du weder einen Copy-Ctor noch einen Zuweisungsoperator. Der Compiler legt bereits beides für Dich an.

    Print sollte eigentlich kein Problem sein, wenn das tatsächlich Dein Abschlussprojekt an der Uni ist.

    void Date::print(std::ostream& s)
    {
        s << day << '.' << month << '.' << year;
    }
    

    Dann damit ggf. noch den operator<< überladen, damit es richtig schön wird.



  • Playmuckel schrieb:

    Dann noch einen Copy Constructor und Assignment Overload

    Du meinst wohl Assignment-Operator

    Davon abgesehen das bei dieser trivialen Klasse (Keine Zeiger als Member...) die automatisch generierten ausreichen, ist deren Signatur bei dir falsch [Kopykonstruktor wurde schon erwähnt, hier nur der Zuweisungsoperator noch einmal]:

    // Falsch
    void operator 
    Date operator = ( Date & r);
    

    Die Schreibweise wäre wenn:

    // Richtig
    Date& operator = (Date const & r)
    

    Die Referenzrückgabe, da soviel ich weiß auch folgendes mit trivialen Datentypen möglich ist:

    int a, b, c, d;
    a = b = c = d = 4;
    

    Auch wenn ich dies selbst nicht machen würde...

    Und eine Konstante Referenz, da du den Wert wohl kaum abändern willst, bei einer Zuweisung trivialer Datentypen, wird ja auch nicht der zugewiesene Wert geändert.

    cu André



  • Danke,
    ja des ist des abschluss project und ich gehe an ein amerikanisches college und hier ist c++ eine programm requirment für Bauingenieurwesen und ich muss sagen ich habe nicht so viel damit zu tun und bin eigentlich ganz froh dass ich es heute abend geschafft habe und ohne das Forum hier wäre ich nie so weit gekommen.

    Ok,
    nachdem ich jetzt erfolgreich dank eurer Hilfe zum zweiten teil meines Finals gelangt bin. Hier muss man des einschicken und wenn es gut genug ist, gibt der lehrer einem den nächsten teil des assignments.
    Jetzt soll man eine child class Time machen von date. Wieder 3 int diesmal hour min und sec. Dann wieder getsec, setsec und so on. Default constructor, constructor with 6 args. Wieder copy constr und assignment overload function und Print time function, so wie ich des jetzt sehe ist des eigentlich des selbe in grün oder?



  • Playmuckel schrieb:

    so wie ich des jetzt sehe ist des eigentlich des selbe in grün oder?

    Jop. Sollte recht banal sein.



  • drakon schrieb:

    Playmuckel schrieb:

    so wie ich des jetzt sehe ist des eigentlich des selbe in grün oder?

    Jop. Sollte recht banal sein.

    Ich würde day, month und year auch nicht protected sondern private machen. Deine time-Klasse kann darauf über die getter und setter zugreifen, bzw. zum Konstruieren den Date-Konstruktor benutzen.



  • des mit dem protected will der lehrer so.
    So hier mal die zweite Class

    class Time: public Date
    { protected:
                 int hour;
                 int minute;
                 int second;
    public:  Time() : Date ()
             {
                    }
             Time:: Time (int d, int m, int y, int hr, int min, int sec)
                  { day = d; month = m; year = y; hour = hr; minute = min; second = sec; }
    
            Time( Time const& r )
    
            Time& operator = (Time const & r) 	
    
                  { day = r.day;
                    month = r.month;
                    year= r. month;
                    hour = r.hour;
                    minute = r. minute;
                    second = r. second;
                    return * this;
                    }
    
    void Time::print(std::ostream& s)
                   {
                    s << day << '.' << month << '.' << year << hour << '.' << minute << '.' << second <<;
                    } 
                     Date( Date const& r )
    
                      int gethour ()
                 {return hour}
    
                 int getminute ()
                 {return minute}
    
                 int getsecond ()
                 { return second}
    
                 void sethour (int)
    
                 void setminute (int)
    
                 void setsecond (int)
    
                 void Date:: sethour(int hr)
                 { hour = hr}
    
                 void Date:: setminute (int min)
                 { minute = min)
    
                 void Date:: setsecond (int sec)
                 { second = sec}
    

    Danack kommt noch Teil 3 mal schauen was dass dann ist



  • Rück doch deinen Code mal anständig ein. Das kann man ja kaum lesen.. 🙄

    Initialisierungsliste darfst du auch gebrauchen und getter kannst(solltest) du const machen.

    Und warum du die setter nicht in einem Anlauf schreibst leuchtet mir auch nicht ein..



  • und hier der letzte Teil
    Erstelle eine Main function, die zwei instanzen von date und time hat. Und dann soll Time 1 gleich machen zu Time 2 und dann wieder alles anzeigen. wie macht man des mit dem gleich machen?



  • Playmuckel schrieb:

    und hier der letzte Teil
    Erstelle eine Main function, die zwei instanzen von date und time hat. Und dann soll Time 1 gleich machen zu Time 2 und dann wieder alles anzeigen. wie macht man des mit dem gleich machen?

    Was meinst du mit "gleich machen"?!



  • drakon schrieb:

    Was meinst du mit "gleich machen"?!

    Ich glaube mal das ist so gemeint:

    Time time1, time2;
    time1 = time2;
    

    Natürlich sollte man time1 und time2 noch gleich ein paar Werte übergeben :).



  • Playmuckel schrieb:

    Erstelle eine Main function, die zwei instanzen von date und time hat. Und dann soll Time 1 gleich machen zu Time 2 und dann wieder alles anzeigen. wie macht man des mit dem gleich machen?

    So ist es wirklich mühsam, zu helfen.

    Wenn du schon die Aufgabe abliest, könntest du sie so stellen, dass man sie versteht. "Zwei Instanzen von date und time" - sind das je zwei? Time 1 und Time 2 sollen die Namen der Instanzen von time sein? Und "gleich machen"? Man kann ja hier nur raten...

    Mizar schrieb:

    Ich glaube mal das ist so gemeint:

    Time time1, time2;
    time1 = time2;
    

    Dafür existiert das Wort "Zuweisung". Das sollte aber - wie schon erwähnt wurde - ohne Probleme funktionieren, da vom Compiler ein automatischer Zuweisungsoperator generiert wird.



  • Nexus schrieb:

    Mizar schrieb:

    Ich glaube mal das ist so gemeint:

    Time time1, time2;
    time1 = time2;
    

    Dafür existiert das Wort "Zuweisung". Das sollte aber - wie schon erwähnt wurde - ohne Probleme funktionieren, da vom Compiler ein automatischer Zuweisungsoperator generiert wird.

    Da hast du natürlich absolut recht. Wenn man time2 nun time1 zuweist hat ja time1 anschließend die gleichen "Werte" wie time2 . So gesehen würde das zu "gleich machen" passen und etwas anderes fällt mir zu "gleich machen" auch nicht ein. In der Aufgabe sollte ja auch ein eigener Zuweisungsoperator definiert werden und ich denke mir mal durch das "gleich machen" bzw. der Zuweisung soll einfach überprüft werden ob der eigene Zuweisungsoperator funktioniert.



  • Noch was zum Code:

    Playmuckel schrieb:

    Time:: Time (int d, int m, int y, int hr, int min, int sec)
                  { day = d; month = m; year = y; hour = hr; minute = min; second = sec; }
    

    Da wäre eine Initialisierungsliste angebracht.

    Playmuckel schrieb:

    int gethour ()
                 {return hour}
                 
                 int getminute ()
                 {return minute}
                 
                 int getsecond ()
                 { return second}
                 
                 void sethour (int)
                 
                 void setminute (int)
                 
                 void setsecond (int)
                 
                 void Date:: sethour(int hr)
                 { hour = hr}
                 
                 void Date:: setminute (int min)
                 { minute = min)
                 
                 void Date:: setsecond (int sec)
                 { second = sec}
    

    Und hier fehlen diverse Strichpunkte. Wieso implementierst du eigentlich einige der Memberfunktionen inline und andere nicht? Das würde ich konsequent machen.

    Mizar schrieb:

    In der Aufgabe sollte ja auch ein eigener Zuweisungsoperator definiert werden und ich denke mir mal durch das "gleich machen" bzw. der Zuweisung soll einfach überprüft werden ob der eigene Zuweisungsoperator funktioniert.

    Ja, das kann gut sein. Meiner Ansicht nach wäre es aber sinnvoller, ein Anwendungsbeispiel für den operator= zu zeigen, wenn dieser auch selbst implementiert werden muss...



  • Ok danke, ja ich meinte den Wert von einer Instance in die andere kopieren. Für mich ist dass ganze ein Buch mit 7 siegeln und ich bin dankbar für jede hilfe und ja ich habe Time 1 und Time 2 werte gegeben.



  • Also ist es jetzt geklärt?

    Und der Code mit den Fehlern (siehe mein vorheriger Post) kompiliert so?



  • naja der code muss nicht komplieren er will nur, dass wir diese class schreiben und des wars. also ich mache einfach Time2 = time1



  • Playmuckel schrieb:

    naja der code muss nicht komplieren er will nur, dass wir diese class schreiben und des wars.

    Ah, sehr sinnvoll. Es besteht also kein Anspruch auf Richtigkeit des Codes? 🙄

    Playmuckel schrieb:

    also ich mache einfach Time2 = time1

    Ja, halt eine normale Variablenzuweisung.



  • nicht wirklich solange es einigermaßen stimmt gibt er dir ne gute note


Anmelden zum Antworten