Klassen+Vererbung



  • Morgen,
    hab mal wieder eine Frage/Problem: Ich habe die Basisklasse Auftrag, jetzt habe ich mir das so vorgestellt, dass ich weiter Klassen Bauauftrag, Abreißen, Verkaufen von dieser Klasse erben lasse. Soweit kein Problem. Jetzt will ich aber all diese Klassen in einer Liste/Vector speichern, um sie nacheinander abarbeiten zu können. Wie mache ich das? Ich kann ja nicht unterschiedlich Datentypen in einen Vector packen 🙄

    Hier ein Codebeispiel, könnt ihr auch mal schauen ob ich die enum's richtig benutze:

    class Auftrag{
    private:
    enum status{FERTIG, IN BEARBEITUNG,...};
    int x,y,z; 
    time_t start; //Wann der Auftrag ausgeführt werden soll
    int status;
    public:
    Auftrag(int status, time_t start){
    this->status=status;
    this->start=start;
    }
    ~Auftrag();
    };
    class Bauauftrag:Auftrag{
    private:
    int gebaeude;
    enum gebaeude_{TURM,BRUECKE,WERKSTATT,HAUS};
    public:
    Bauauftrag(int status, int gebaeude):Auftrag(status);
    ~Bauauftrag();
    };
    [...]
    vector<???> Auftraege;//Hier weiß ich nicht weiter
    

    Vielen Dank 🙂



  • Ich hatte ein ähnliches Problem. Ich habe hierzu einen Boost vector genommen. Hat wunderbar funktioniert. Das ganze ist aber nicht schön da du beim auslesen immer casten musst.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-255536-and-highlight-is-.html
    http://www.boost.org/

    Gruß



  • Mache in der Basis Klasse / Interface eine (pure) virtuelle Methode: z.B. void abarbeiten()...

    Nun tust Du in den konkreten Aufträgen, z.B. den BauAuftrag die Methode abarbeiten() überschreiben, bzw. implementieren.

    Im Vecctor speicherst Du Zeiger auf Aufträge:

    std::vector<Auftrag*> meineAuftraege;

    Gruss Simon

    Edit:
    Ausserdem wäre bei der Verebung von Autrag eine public Vererbung angesagt. Und der Destruktor der Klasse Auftrag muss virtuell sein, falls Du (und das tust Du wahrscheinlich) delete auf einen Basis Klassenzeiger aufrufst.



  • Boost.PointerContainer empfiehlt sich auf jeden Fall, wenn man Zeiger auf polymorphe Objekte in Containern speichern möchte. Die Schnittstelle ist soweit möglich kompatibel zur STL, aber man muss sich nicht um die Speicherverwaltung kümmern.



  • Ok danke werd ich gleic ausprobieren 👍
    Edit: ich will jetzt in jeder Klasse Auftrag die Zeit speichern, wann er ausgeführt werden soll. Ich will also nicht speichern in wie vielen Sekunden, sondern im Format hh🇲🇲ss. Ich hab überhaupt keine Ahnung wie das geht 🙄 Über google hab ich nur eine Klasse time_t gefunden mit der man die aktuelle Uhrzeit speichern kann, wie aber einen festen Zeitpunkt in der Zukunft speichern? Ich hab mir das so vorgestellt: (pseudocode)

    time_t start=11:00:03 // Elf Uhr und 3 sekunden^^
    ...
    if(start==aktuelle_zeit) AuftragAusführen();
    

    Geht das überhaupt so? 😕



  • Nein, das geht so nicht. Das ist einfach eine Stuktur, die du füllen musst. Zur Benutzung kannst du z.B mal hier schauen:
    http://en.wikipedia.org/wiki/Time_t



  • Hmm, kennt jemand eine funktion mit der ich die tm Struktur um zum Beispiel 10 Minuten nach hinten verschieben kann? Oder muss ich mir die selber schreiben? 😉



  • Mit der Funktion localtime() erhältst du die aktuelle Zeit in der Struktur tm . Dir wird allerdings ein Zeiger zurückgegeben; besser, du legst eine Kopie an. Dann änderst du den Member tm_min , und erhöhst tm_hour wenn nötig. Tipp: Benutze Modulo und Integerdivision.

    Genauere Beschreibungen zu der C-Zeitbehandlung findest du unter http://www.cplusplus.com/reference/clibrary/ctime/.



  • Nexus schrieb:

    Dann änderst du den Member tm_min , und erhöhst tm_hour wenn nötig.

    Ja schon klar, aber wenn es blöd läuft muss ich ja sogar das komplette Datum umschreiben, das Programm soll ja rund um die Uhr funktionieren^^, und ich glaube, dass das etwas kompliziert ist. Was ist denn wenn ich das ganze um 23:58 am 31.Dezember ausführe? 😉

    Nexus schrieb:

    Tipp: Benutze Modulo und Integerdivision.

    Was ist das? 🙄

    Sry wenn ich mich so anstelle, für euch ist das wahrscheinlich alles eine Sache von ein paar Minuten 😉


  • Administrator

    [MOP] schrieb:

    Nexus schrieb:

    Tipp: Benutze Modulo und Integerdivision.

    Was ist das? 🙄

    Modulo
    Und was eine Division ist, wirst du ja wohl noch wissen 😉

    Der Modulo Operator ist sehr praktisch, wenn du etwas immer in einem Bereich halten möchtest. Ein kurzes Beispiel:

    int seconds = 2342143;
    
    // Ich will jetzt wissen, wieviele Stunden, Minuten und übrig bleibende Sekunden dies sind.
    
    int hours = seconds / (60 * 60);
    seconds %= 60 * 60; // Modulooperator ist das Prozentzeichen '%'
    // In seconds steht nun der Rest der Division. Also liegt es im Bereich 0 - 3599.
    
    int minutes = seconds / 60;
    seconds %= 60;
    // Der Bereich von seconds ist nun 0 - 59.
    

    Falls du mehr machen willst mit Daten und dazu Funktionen suchst, würde sich natürlich noch Boost.DateTime anbieten. Sind aber um einiges komplexere Strukturen, bieten dafür natürlich viel mehr Möglichkeiten von Haus aus.

    Grüssli



  • Ah ok, man muss einfach alles in sekunden speichern, und dann mit dem Modulo auf Stunden, Minuten usw umrechenen. Wenn es dann aber um Tage, Monate, und Jahre geht, ist das zu aufwendig, denke ich. Deswegen werde ich mir jetzt Boost.DateTime anschauen 🙂
    Was wäre C++ nur ohne Boost? 😉


  • Administrator

    [MOP] schrieb:

    Wenn es dann aber um Tage, Monate, und Jahre geht, ist das zu aufwendig, denke ich.

    Wenn du Dokumentationen nicht richtig liest und es über Modulo & Co machst, ja ...

    Dokumentationen nicht richtig lesen deshalb:
    http://www.cplusplus.com/reference/clibrary/ctime/mktime/

    Lies mal was dort ganz oben steht. Na, ich zitiere es lieber:

    Convert tm structure to time_t
    Interprets the contents of the tm structure pointed by timeptr as a calendar time expressed in local time. This calendar time is used to adjust the values of the members of timeptr accordingly and returned as an object of type time_t.

    The original values of the members tm_wday and tm_yday of timeptr are ignored, and the ranges of values for the rest of its members are not restricted to their normal values (like tm_mday being between 1 and 31).

    The object pointed by timeptr is modified, setting the tm_wday and tm_yday to their appropiate values, and modifying the other members as necessary to values within the normal range representing the specified time.

    Grüssli



  • Achso 😮 Mann bin ich blöd 😉


Anmelden zum Antworten