C++ Eine Map mit MapElementen welche eine Abstrakte Klasse ist



  • Eine eher nicht technischer Hinweis: Als dualer Student kenne ich die Vorgabe (Ich würde es eher Wunsch nennen 😉 ), dass man theoretisches Wissen aus der Uni mit der praktischen Arbeit verbindet.
    Das soll explizit aber nicht heißen, dass man unsinnige Dinge macht, nur damit man "Wissen aus der Theorie" in die Praxis umgesetzt hat. Auf gut deutsch: Du hast selber erkannt, dass deine Map Implementierung zu Lernzwecken dient und es dafür eine (bessere) Klasse in der STD gibt. Von daher solltest du auf der Arbeit (und in jedem anderen Projekt, welches nicht zu Lernzwecken dient) auch die verwenden.

    Persönliche habe ich den "Wunsch" des Verbinden von Theorie und Praxis immer herzlich ignoriert. Das funktioniert nun mal einfach nicht für jedes Thema. Wenn jemand wirklich das mal explizit kritisiert hätte, wären mir aber auch ein paar Ausreden eingefallen.
    Dann ist dein "Theorie in die Praxis umsetzen" eben, dass du C++ schreibst, wie du auch in der Universität gelernt hast etc.



  • @Schlangenmensch
    Das einzige was sich eigentlich verschieden verhält sind halt die Messwerte, bei Temperaturen kalibrieren wir die mit einem Hitzebad und dieser Wert wird notiert. Bei den Druckaufnehmern nehmen wir nur den Funktionsbereich auf z.B. 0-16bar und das unterscheidet sich halt von 141,6°C deswegen dachte ich halt an Polyphormie. Wollte halt das bei der Print oder Set Methode bei Durckaufnehmern nicht rummeckert, dass das halt n Wert y - x bar und einmal bei den Temperaturen halt 136,6°C sei.



  • @Farmer-Zorro
    Macht es wirklich Sinn die verschiedenen Arten von Messwerten in der selben Map zu speichern?
    Kommt mir jetzt eher so vor als ob es besser wäre dafür getrennte Maps zu verwenden.

    Und natürlich frage ich mich ob es überhaupt Sinn macht hierzu etwas in C++ zu programmieren. Ohne weiteres darüber zu wissen würde ich da jetzt eher an Excel denken.



  • @DocShoe
    Der Dozent hat nicht auf dem halben Weg aufgehört das Problem liegt eher am Lehrplan. Der hat halt seine Lehrvorgaben gehabt und musste die in 10 Vorlesungen reinkriegen da wurde vieles wie bspw. die Map nur angekratzt was natürlich auch irgendwo schade ist, ist aber nicht vermeidbar in der Lehre.

    Was die Temperatur und Druckaufnehmer eindeutig macht ist ein der Betriebsmittelkennzeichnung(Bmk) ein Buchstabe der irgendwo in einer Zahlen und Buchstaben Kombination versteckt ist(ist auch von jedem Kunden abhängig wie die Bmks auszusehen haben), für Temperaturen steckt da ein "T" drinnen und für Druckaufnehme irgendwo ein "P". Jedoch sind die Position als auch von den T/P nicht immer die selben.



  • @hustbaer
    Also das Modul hieß "Problemorientierte Programmierung" was halt in C++ in der Industrie gelöst wird. Ob es nun die Programmierung von Steuergeräten ist o.ä. Somit muss ich irgendwas mit C++ machen. Mein Longtermziel wäre es eh gewesen die Map mit den einzelnen Attributen mit Hilfe einer Header File dich ich auch GitHub gefunde habe in ein Excel Dokument auszugeben. Eventuell sogar eine Excel Datenbank anzulegen. Jedoch sprengt das alles irgendwann den Rahmen da ich insgesamt 6 Hausarbeiten anfertigen muss.

    Ich merke gerade das meine Idee eventuell nicht so logisch ist wie ich erhofft hatte und auch nicht unbedingt so umsetzbar ist mit den Methoden und Wissen was mir zur Verfügung steht.



  • Naja, wenn das ganze nur für ne Hausübung ist, dann würde ich sagen: verwende deine Map, aber ohne Polymorphie.
    Entweder mit einer "Messpunkt" Klasse die du sowohl für Temperatur als auch für Druck verwendest. Oder halt mit zwei getrennten "Messpunkt" Klassen, dann aber auch in zwei gertennten Maps.

    Ich würde aber eher nicht empfehlen dann zu versuchen das in der Praxis im Job weiter zu verwenden.



  • @hustbaer
    Ich danke dir für dein/euer Feedback erstmal. Ich lasse mir das nochmal durch den Kopf gehen und gucke ob ich vielleicht auch eine bessere Anwendung finde.
    @DocShoe hatte ja die Standard Map verwendet und als Value Temperatur genommen, kann ich die Standard Map in dieser Form anwenden ->

    Map<std::string (für das BMK), Temepratur/Druck als Value, Messwerte);
    

    wobei Messwerte dann eine Abstrakte Klasse ist?

    Ich bin mit der Funktionsweise der Standard Map nicht betraut und gucke mir die dann die Tage nun genauer.



  • @Farmer-Zorro sagte in C++ Eine Map mit MapElementen welche eine Abstrakte Klasse ist:

    @hustbaer
    Ich danke dir für dein/euer Feedback erstmal. Ich lasse mir das nochmal durch den Kopf gehen und gucke ob ich vielleicht auch eine bessere Anwendung finde.
    @DocShoe hatte ja die Standard Map verwendet und als Value Temperatur genommen, kann ich die Standard Map in dieser Form anwenden ->

    Map<std::string (für das BMK), Temepratur/Druck als Value, Messwerte);
    

    wobei Messwerte dann eine Abstrakte Klasse ist?

    Nein. Aber wieso machst du nicht einfach 2 Maps, eine für Temperatur und eine 2. für Druck?



  • Eine andere Alternative ist eine verschachtelte Map:
    map<string für BMK, map<string für Messwerttyp, float für Messwert>>
    Damit könntest du dann für ein BMK beliebig viele Messwerttypen mit Messwerten abspeichern.

    Ob das aber in dieser Form für dich sinnvoll wäre, weiß ich nicht.

    Oder hast du immer Temp und Druck für eine BMK? Dann ein struct mit den 2 Variablen temp und pressure machen und diese Struct in die Map?

    Da dies eine Hausarbeit ist offenbar mit dem Ziel die Map zu verwenden, kannst du dir vermutlich irgendeine sinnvolle Kombination ausdenken.

    Ich sehe auch erstmal keinen Grund für Polymorphie und habe manchmal den Eindruck, dass es als universelle Waffe für alles (inkl. unpassende Fragestellungen) statt ausschließlich für passende Probleme gelehrt wird.



  • @Farmer-Zorro sagte in C++ Eine Map mit MapElementen welche eine Abstrakte Klasse ist:
    ...

    Was die Temperatur und Druckaufnehmer eindeutig macht ist ein der Betriebsmittelkennzeichnung(Bmk) ein Buchstabe der irgendwo in einer Zahlen und Buchstaben Kombination versteckt ist(ist auch von jedem Kunden abhängig wie die Bmks auszusehen haben), für Temperaturen steckt da ein "T" drinnen und für Druckaufnehme irgendwo ein "P". Jedoch sind die Position als auch von den T/P nicht immer die selben.

    Wenn die Art des Messwerts durch das BMK festgelegt werden, dann können Temperature und Pressure durch den gleichen Datentyp abgebildet werden und brauchen ggf. nur ein weiteres Attribut, das die Art des Messwerts festlegt.

    Oder kommt sowas infrage?

    class MeasurementRecord
    {
       std::string BMK_;
       double Temperature_ = 0.0;
       double Pressure_ = 0.0;
    public:
       MeasurementRecord() = default;
    
       // getter/setter für Bmk, Temperatur und Druck spare ich mir hier
    
       bool has_temperature() const
       {
          return BMK_.find( 'T' ) != std::string::npos;
       }
    
       bool has_pressure() const
       {
          return BMK_.find( 'P' ) != std::string::npos;
       }
    };
    


  • @DocShoe sagte in C++ Eine Map mit MapElementen welche eine Abstrakte Klasse ist:

    bool has_temperature() const
    {
    return BMK_.find( 'T' ) != std::string::npos;
    }

    Ich denke, bei Messwerten könnte man
    a) float nehmen (in der Regel haben die Sensoren eh keine double-Genauigkeit)
    b) NaN für "nicht vorhanden" wählen und sich den String sparen

    NaN wäre meiner Meinung nach auch der sinnvollere Default als 0.0, was ja durchaus (wenn in °C gemessen) eine sinnvolle Temperatur ist. Für K-Slaka wäre das schon extrem kalt... Und mit gettern/settern würde ich für einen Measurement-Record gar nicht erst anfangen. Mögen einige bestimmt anders sehen, ich halte es für unnötigen Boilerplate. Einfach public machen. Fertig.


Anmelden zum Antworten