Basisklasse mit unbekannter Anzahl an abgeleiteten Klassen



  • Hallo cpp-community,

    ich habe mich hier vor kurzem angemeldet, da ich mich intensiver mit der c++Programmierung beschäftigen will. Ich habe schon ein wenig Erfahrung mit Delphi und c# gesammelt, möchte aber jetzt aufgrund der Umstellung meines Rechners auf Ubuntu auch mit der Programmierung in c++ tiefergreifende Erfahrung sammeln. Da ich schon Erfahrungen in anderen Programmiersprachen habe, nutze ich die "Notizen zu C++" von Peter Thömmes. Ich habe mir auch ein kleineres Projekt überlegt, welches ich zur Einarbeitung umsetzen will, dabei bin ich jetzt aber auf ein Problem gestossen, welches ich auch bisher noch nie lösen konnte:

    Situation: eine Basisklasse z.B. Auto
    von dieser Basisklasse sollen Klassen abgeleitet werden, z.B. Opel, BMW, VW ...
    für eine Betrachtung will der User (nicht Programmierer) eine Klasse hinzufügen, die der Programmierer nicht vorgegeben hat, also müssen ja die Daten z.B. in einer Datei über einen Editor gespeichert werden.

    jetzt die Frage: Wie mache ich (als Programmierer) das ganze so, dass mein Programm erkennt, dass der neue Datensatz mit in das Programm als neue Klasse abgeleitet von der Basisklasse integriert.

    Bitte bei der Antwort beachten: Ich bin ein Hobby-Programmierer, das bedeutet, ich habe sicherlich ein eher oberflächliches Wissen über die allgemeinen Themen in der Programmierung. Ein Tutorial für das Thema wäre eventuell sehr gut für mich, da ich dann weniger (unqualifizierte) Fragen stelle und mich selbständig in das Thema einarbeiten könnte.

    Vielen Dank
    mirrowwinger



  • Der Benutzer der Applikation kennt keine Klassen, daher musst du auch nicht neue extra für ihn generieren. Erstelle als Programmierer Klassen, die sich mit Daten des Benutzers füllen lassen. Also z.B. mit einem std::string -Member für den Autonamen.

    Und um C++ zu lernen/nachzuschlagen würde ich dir ein gutes Buch wie z.B. den C++-Primer empfehlen. Gegenüber Tutorials bin ich sehr skeptisch, meistens kriegst du da höchstens die Hälfte mit.

    Übrigens wäre das C++-Unterforum hierfür besser geeignet.



  • @mirrowwinger:

    1. Lustiger Name 🙂

    2. Was du vor hast geht nicht, da du zu einem laufenden C++ nicht einfach so neue Klassen hinzufügen kannst

    3. Wieso meinst du neue klassen zu brauchen? Beschreib mal was du machen willst, bin mir fast sicher dass wir ne andere Lösung finden.



  • mirrowwinger schrieb:

    Situation: eine Basisklasse z.B. Auto
    von dieser Basisklasse sollen Klassen abgeleitet werden, z.B. Opel, BMW, VW ...
    für eine Betrachtung will der User (nicht Programmierer) eine Klasse hinzufügen, die der Programmierer nicht vorgegeben hat,

    um neue Klassen zur Laufzeit abzuleiten, brauchst du leider eine Sprache mit mehr Reflexionsvermögen als C++
    - mit einer geeigneten Sprache ist so was ein Einzeiler.

    s := FillInTheBlankMorph request: 'Klassenname?'. Auto subclass: s asSymbol.
    


  • Also ich möchte eine Art Simulation schreiben (kein wirtschaftlicher Hintergrund sondern ein reines Vertraut machen mit unterschiedlichen Konzepten der OOP). Dieses kleine Projekt soll eine Umgebung beinhalten, welches aufgrund einer kleinen vom Userer erweiterbaren Datenbank am Anfang die Objekte einer Datenbank auswertet und entsprechend Objekte (welche in der Datenbank enthalten sind) erzeugt.
    Es gibt also eine Basisklasse (belassen wir es mal bei der Anschauung von Autos) die Eigenschaften zur Verfügung stellt (z.B. Anzahl Türen, Anzahl Sitzplätze, Front-/ Heckantrieb, ...) Das Programm erstellt gemäß den Vorgaben der Datenbank am Anfang einmalig die entsprechende Anzahl an Objekten und weißt ihnen die individuellen Eigenschaften zu, damit die Simulation damit arbeiten kann. Eine Änderung der Objekte ist bis Ende des Programmes nicht nötig!

    MfG
    mirrowwinger



  • mirrowwinger schrieb:

    Also ich möchte eine Art Simulation schreiben (kein wirtschaftlicher Hintergrund sondern ein reines Vertraut machen mit unterschiedlichen Konzepten der OOP). Dieses kleine Projekt soll eine Umgebung beinhalten, welches aufgrund einer kleinen vom Userer erweiterbaren Datenbank am Anfang die Objekte einer Datenbank auswertet und entsprechend Objekte (welche in der Datenbank enthalten sind) erzeugt.
    Es gibt also eine Basisklasse (belassen wir es mal bei der Anschauung von Autos) die Eigenschaften zur Verfügung stellt (z.B. Anzahl Türen, Anzahl Sitzplätze, Front-/ Heckantrieb, ...) Das Programm erstellt gemäß den Vorgaben der Datenbank am Anfang einmalig die entsprechende Anzahl an Objekten und weißt ihnen die individuellen Eigenschaften zu, damit die Simulation damit arbeiten kann. Eine Änderung der Objekte ist bis Ende des Programmes nicht nötig!

    War das jetzt die Antwort auf deine Frage? Hört sich so an.



  • @mirrowwinger:
    OK. Und wo in all dem glaubst du dynamisch erstellte Klassen zu brauchen?



  • Hmm naja von dynamisch nur von unbekannter Anzahl (glaube ich) war keine Rede, nur ist die Vorgehensweise des Erstellens einer solchen unbekannten Anzahl noch ein wenig unklar für mich! (darauf zielte der Thread eigentlich hin)
    Wie händle ich das mit den Klassen? Ist es z.B. besser diese in einer Liste zu erstellen oder dynamisches Array, ...? Welches Vorgehen bietet die beste PErformance oder welches ist ungeeignet oder gibt es prinzipiell dort ein spezifisches Vorgehen?

    mirrowwinger



  • Bei dir könnte es schon ein einfaches Array tun. Ansonsten http://de.wikipedia.org/wiki/Datenstruktur



  • mirrowwinger schrieb:

    nur ist die Vorgehensweise des Erstellens einer solchen unbekannten Anzahl noch ein wenig unklar für mich! (darauf zielte der Thread eigentlich hin)
    Wie händle ich das mit den Klassen?

    wie gesagt für so ein Vorhaben bist du mit C++ an der verkehrten Sprache.

    ... was nicht heißt, daß das generell nicht geht.

    Es gibt dynamische Sprachen, mit denen es sehr einfach ist, beisp.weise eine Klassenhierarchie der Tiefe 100:
    Object < Stage1 < Stage2 < ... < Stage100
    zur Laufzeit zu erzeugen

    c := #Object.
    1 to: 100 do: [ :n | 
    	s := ('Stage', n printString) asSymbol. 
    	(Smalltalk at: c) subclass: s. 
    	c := s ].
    


  • @mirrowwinger
    Kann es sein dass du Klassen und Objekte verwechselst 😕



  • Es ist völlig sinnfrei, verschiedene Automarken von einer Auto-Basisklasse abzuleiten. Die Marke ist ein Attribut eines Autos, aber sie ist kein Auto.
    Lösung:

    string Car::getBrand()
    void Car::setBrand(string brand)


Log in to reply