Unendlich viele Member in einer Klasse erzeugen



  • Hallo Leute;

    gibt es eine Möglichkeit die Member einer Klasse während der Programmablaufs beliebig zu weitern.

    Ich möchte nicht beliebig viele Instanzen erzeugen, da Member Eigenschften der Instanz darstellen sollen. Das soll heißen ich habe bspw. eine Klasse "Maschine". Der Anwender soll eine Instanz bspw. Bohrmaschine anlegen. Dabei kann er beliebig viele Variablen Nutzen. Ich möchte ihn nicht durch die Vorgabe der Member in der Klasse einschränken.

    Gruß
    pluxyy



  • Ich glaube was du brauchst ist schlicht ein assoziativer container, wie unordered_map.

    std::unordered_map <std::string, ?> properties; // ? = std::string womöglich.

    (Wenn dir der nicht bekannt vorkommt, dann gibt es im Netz eigentlich gut info dazu).

    Kurz:

    std::unordered_map <std::string, std::string> properties;
    properties["width"] = "250";
    properties["height"] = "125";
    
    std::cout << properties["width"]; // 250
    

    So wie du dir das momentan vorstellst geht das gar nicht.



  • Sprachlich-logische Klugscheißerei am Rande:

    Man wird nie unendlich viel von irgendwas erzeugen können, denn wenn man damit fertig wäre,
    hätte man das "Ende" von "unendlich" erreicht. Und dieses "Ende" kann es nicht geben, da dann die Unendlichkeit endlich wäre 😃

    Finnegan


  • Mod

    Finnegan schrieb:

    Man wird nie unendlich viel von irgendwas erzeugen können, denn wenn man damit fertig wäre,
    hätte man das "Ende" von "unendlich" erreicht. Und dieses "Ende" kann es nicht geben, da dann die Unendlichkeit endlich wäre 😃

    Zeichne mal eine Linie auf Papier und zähl die Anzahl der Punkte.



  • SeppJ schrieb:

    Zeichne mal eine Linie auf Papier und zähl die Anzahl der Punkte.

    Okay, das ist mir jetzt peinlich. Ich nehme das "von irgendwas" zurück und schränke ein: "undendlich viele diskrete Objekte". 😉

    Finnegan



  • @pluxyy
    In C++ geht das was du willst nicht.
    Du kannst natürlich drumrumarbeiten, eben mit std::map oder was auch immer, aber ich vermute mal das willst du nicht.

    Guck dir statt dessen mal Python und JavaScript an.



  • Guten Abend.

    #include <iostream>
    using namespace std;
    #define AddMember(successor, predecessor, type, member)  \
      class successor : public predecessor { public: type member; }; \
      successor successor##_;
    class Empty {};
    int main(void)
    {
      AddMember(One, Empty, string, Foo);
      AddMember(Two, One, const char*, Bar);
      AddMember(Three, Two, int, Blub);
      Three_.Foo = "hello";
      Three_.Bar = "world";
      Three_.Blub = 123;
      cout << Three_.Foo << " " << Three_.Bar << " " << Three_.Blub << endl;
    }
    


  • klassenmethode schrieb:

    Guten Abend.

    #include <iostream>
    using namespace std;
    #define AddMember(successor, predecessor, type, member)  \
      class successor : public predecessor { public: type member; }; \
      successor successor##_;
    class Empty {};
    int main(void)
    {
      AddMember(One, Empty, string, Foo);
      AddMember(Two, One, const char*, Bar);
      AddMember(Three, Two, int, Blub);
      Three_.Foo = "hello";
      Three_.Bar = "world";
      Three_.Blub = 123;
      cout << Three_.Foo << " " << Three_.Bar << " " << Three_.Blub << endl;
    }
    

    pluxyy schrieb:

    gibt es eine Möglichkeit die Member einer Klasse während der Programmablaufs beliebig zu weitern.



  • mach' ich doch. Während des Compilers abläuft. Ist das kein Programm?



  • klassenmethode schrieb:

    mach' ich doch. Während des Compilers abläuft. Ist das kein Programm?

    Nö. Du "erweiterst" die Klasse bevor der Compiler läuft, nicht währenddessen.



  • Das war ein Witz ... Natürlich kann man in einer Sprache, in der das Memory-Layout einer Klasse zur Compilezeit festliegt, keine Members zur Laufzeit nachrüsten.



  • Ich persönlich meine auch, dass eine Map<Identifier, Function> oder Map<Identifier, Value> keine so schlechte Alternative wäre. Vielleicht hast du ja ein konkreteres Beispiel, wie der Code aussehen soll und was dann zur Laufzeit genau möglich gemacht werden soll. Deine bisherige Beschreibung lässt schon noch einiges an Interpretationsfreiraum.



  • SeppJ schrieb:

    Zeichne mal eine Linie auf Papier und zähl die Anzahl der Punkte.

    Nur Sepp kann aus etwas endlichem etwas unendliches machen. Und das auch noch gleichzeitig. Klingt für manche erstmal nicht paradox; ich frage einfach: Welche Punkte ?!



  • Stell Dich nicht dümmer, als Du bist. <*)))o><


  • Mod

    inf/inf = 1 schrieb:

    Nur Sepp kann aus etwas endlichem etwas unendliches machen.

    Das konnte schon der alte Zenon.



  • inf/inf = 1 schrieb:

    SeppJ schrieb:

    Zeichne mal eine Linie auf Papier und zähl die Anzahl der Punkte.

    Nur Sepp kann aus etwas endlichem etwas unendliches machen.

    Chuck Norris hat grad angerufen und entschuldigt sich, dass es etwas länger gedauert hat, da er nicht nur die Punkte auf der Linie zählen musste, sondern auch all die Punkte, die dazwischen liegen 🙄

    SCNR,
    Finnegan



  • Das konnte schon der alte Zenon.

    Diese Kunst hat man wohl in den letzten zweieinhalbtausend Jahren verlernt. Oder auch nicht.

    @SG1: Das nenne ich optimistisch.

    PS. Chuck Norris zählt nicht - er kennt die Zahl.
    Oder..
    Ne Linie wirds erst, wenn Chuck Norris jeden Punkt zerquetscht.


  • Mod

    SeppJ schrieb:

    Finnegan schrieb:

    Man wird nie unendlich viel von irgendwas erzeugen können, denn wenn man damit fertig wäre,
    hätte man das "Ende" von "unendlich" erreicht. Und dieses "Ende" kann es nicht geben, da dann die Unendlichkeit endlich wäre 😃

    Zeichne mal eine Linie auf Papier und zähl die Anzahl der Punkte.

    1\aleph_1.

    Chuck Norris bildet aber \emptyset bijektiv auf R\mathbb{R} ab.



  • @OP: schau Dir mal boost::property_tree an bevor Du Dir was mit Maps bastelst. Und überlege Dir Dein eigentliches Problem mal genauer. Mir ist nicht klar was Du genau machen willst.



  • Finnegan schrieb:

    SeppJ schrieb:

    Zeichne mal eine Linie auf Papier und zähl die Anzahl der Punkte.

    Okay, das ist mir jetzt peinlich. Ich nehme das "von irgendwas" zurück und schränke ein: "undendlich viele diskrete Objekte". 😉

    Finnegan

    Doch das geht, du darfst nur nicht annehmen, dass du für jeden Task gleich lange brauchst.

    https://en.wikipedia.org/wiki/Supertask


Log in to reply