dynamisches hinzufuegen von member ??



  • haette mal folgende (spezielle) frage, hoffe koennt helfen:

    ist folgendes szenario eigentlich in C++ moeglich (oder ist vielleicht mein ansatz falsch ??) ->

    angenommen ich haette eine applikation geschrieben die Artikel verwalten soll und es gaebe hierzu eine Artikel Klasse, die diverse member enthielte (id, name, lieferant usw.).

    ist es eigentlich moeglich zu einer klasse zur laufzeit noch mehr member hinzuzufuegen (anwender moechte Artikel zur Laufzeit mit zusaetzlichen Eigenschaften bestuecken) !??!

    oder ist die denkweise falsch und man muesste nicht generell die member erweitern sondern eine bestimmte member die eine liste von artikel-eigenschaften darstellt??

    (darueber hinaus: ist es eigentlich moeglich in C++ eine Klasse zu fragen welche Member sie alle hat ??) 😕

    Vielen Dank.

    danke.



  • pepe75 schrieb:

    oder ist die denkweise falsch und man muesste nicht generell die member erweitern sondern eine bestimmte member die eine liste von artikel-eigenschaften darstellt??

    Das wäre in C++ sinnvoller.

    pepe75 schrieb:

    (darueber hinaus: ist es eigentlich moeglich in C++ eine Klasse zu fragen welche Member sie alle hat ??) 😕

    Nicht in Standard-C++; mit Properties und Reflection z.B. in C++Builder geht das aber.



  • Nein, nein, nein und nein. Grob beantwortet. 😉

    Wenn du so etwas haben willst, wäre das simpelste zB eine:
    std::map<std::string, std::string>, wo du dann ein Attribut auf einen String abbilden kannst.
    attributes["ISBN"] = "1-234-5678-X";
    oder sowas.

    Musst dir nur sicher sein das es auch Sinn macht. Kommt drauf an was du machen willst. Sonst halt eine Liste an virtuellen Parametern, von denen du die entsprechenden Parametertypen ableitest etc. pp.



  • pepe75 schrieb:

    ist es eigentlich moeglich zu einer klasse zur laufzeit noch mehr member hinzuzufuegen (anwender moechte Artikel zur Laufzeit mit zusaetzlichen Eigenschaften bestuecken) !??!

    C++ hat ein statisches Typsystem, eine Anpassung zur Laufzeit ist nicht möglich (Wobei sich so etwas über die schon erwähnten Container nachbilden lässt).

    pepe75 schrieb:

    (darueber hinaus: ist es eigentlich moeglich in C++ eine Klasse zu fragen welche Member sie alle hat ??) 😕

    Nein. Nicht mit direkten C++ Sprachmitteln (Reflektion wird nicht unterstüzt).

    Man kann zwar auch so etwas nachbauen, aber zugegeben passt das eigentlich nicht zu der Art und Weise wie C++ aufgebaut und designt ist.

    Und ohne Reflektion machen auch Laufzeiterweiterungen bei Klassen wenig Sinn (Wobei Reflektion nicht zwangsweise auch eine Laufzeitänderung mit sich bringt).

    cu André



  • Fellhuhn schrieb:

    Nein, nein, nein und nein. Grob beantwortet. 😉

    Wenn du so etwas haben willst, wäre das simpelste zB eine:
    std::map<std::string, std::string>, wo du dann ein Attribut auf einen String abbilden kannst.
    attributes["ISBN"] = "1-234-5678-X";
    oder sowas.

    Musst dir nur sicher sein das es auch Sinn macht. Kommt drauf an was du machen willst. Sonst halt eine Liste an virtuellen Parametern, von denen du die entsprechenden Parametertypen ableitest etc. pp.

    vielen dank (auch an alle anderen beantworter) ->
    womit wir schon bei meiner naechsten frage hierzu waeren:

    wenn eigenschaften als paare von (eigenschafts-name, eigenschaftswert) definiert waeren z.B.:

    std::pair<string, int> postleitzahl("PLZ", 13355);
    std::pair<string, string> name("Name", "Gustl");
    

    wie wuerde dann die allgemeine deklaration einer liste aussehen, die als elemente sowohl obige postleitzahl als auch name enthalten koennte (stichwort template-klasse)??

    vielen dank.



  • pepe75 schrieb:

    wie wuerde dann die allgemeine deklaration einer liste aussehen, die als elemente sowohl obige postleitzahl als auch name enthalten koennte (stichwort template-klasse)??

    Die Liste würde garnicht aussehen. Thema: statisches Typsystem (Sprich entweder 2 Listen, oder gleiche Typen (bzw. kompatible, Thema Polymorphie), oder gefrickel über Varianttypen - letzteres ist meist die schlechteste Wahl).



  • asc schrieb:

    pepe75 schrieb:

    wie wuerde dann die allgemeine deklaration einer liste aussehen, die als elemente sowohl obige postleitzahl als auch name enthalten koennte (stichwort template-klasse)??

    Die Liste würde garnicht aussehen. ...

    lol 😃 .. thnx, ur the man asc .. weiss jetzt wos lang geht.

    danke.



  • pepe75 schrieb:

    lol 😃 .. thnx, ur the man asc .. weiss jetzt wos lang geht.

    Eine Anmerkung noch: Eine PLZ sollte NIEMALS als Zahl dargestellt werden!

    Zum einen können Postleitzahlen mit einer 0 beginnen, die Information verschwindet bei einer Zahl. Zum anderen kann es durchaus auch andere PLZ-Formate geben (Thema: Internationale Postleitzahlen) die nicht ausschließlich aus Zahlen bestehen.

    cu André



  • pepe75 schrieb:

    wie wuerde dann die allgemeine deklaration einer liste aussehen, die als elemente sowohl obige postleitzahl als auch name enthalten koennte (stichwort template-klasse)??

    Ich denke, mit einer std::map<std::string, std::string> bist du am flexibelsten. Wenn zur Laufzeit plötzlich neue Eigenschafen dazu kommen, weisst du ja eh nicht, wie du sie behandeln sollst, d.h. als String abspeichern ist schon mal nicht schlecht.

    Wenn die Eigenschaften nur speichern und lesen willst, also keine Berechnungen oder so anstellst, ist ein std::string als Werttyp der Map schon okay 😉


Anmelden zum Antworten