string als objekt name



  • Hi 🙂

    kann ich wenn ich einen string habe den irgendwie als objektname benutzen ?

    beispiel:

    string s = "miaumiau1";
    
    Katze s.keineahnung();
    
    miaumiau1.eatAllTheFood();
    

    das dann ein objekt entsteht das ich mit miaumiau1 ansprechen kann



  • Nein, kannst du nicht.
    Beim Kompilieren werden Namen aufgelöst, z.B. in die Adressen der Speicherbereiche. Ein String dagegen sind Daten, die unverändert genutzt werden.

    Du kannst allerdings eine Map verwenden, um zu Namen Objekte zuzuordnen, das käme deinem Wunsch nahe.



  • dashu schrieb:

    Hi 🙂

    kann ich wenn ich einen string habe den irgendwie als objektname benutzen ?

    beispiel:

    string s = "miaumiau1";
    
    Katze s.keineahnung();
    
    miaumiau1.eatAllTheFood();
    

    das dann ein objekt entsteht das ich mit miaumiau1 ansprechen kann

    Wozu brauchst du sowas?



  • dashu schrieb:

    das dann ein objekt entsteht das ich mit miaumiau1 ansprechen kann

    Du hast wieder das klassische XY-Problem. Wozu brauchst du das? Was spricht gegen ganz gewöhnliche Identifier?

    Allerdings trifft auf deine Beschreibung perfekt die std::map - dann nimm Youkas Vorschlag:

    std::map<std::string, Katze> map;
    map["miau"].eatAllTheFood();
    


  • @Sone: Bei dir läuft wohl alles auf ein XY Problem hinaus, was?



  • Nicht alles. Aber würdest du sagen, hier wäre es nicht angebracht nach dem eigentlichen "Problem" zu fragen, sondern unverblümt auf std::map zu verweisen? 🙄



  • Danke schon ein mal für die vielen antworten.

    dann schilder ich mal mein Problem genauer 🙂 es ist aber sehr komplex

    Mein Master Programm speichert sich genau in einem Array von KlassenObjekten ab, was denn genau bei ihm passiert.
    Was anderes ist mir nicht eingefallen, da ich einen Int = eindeutige ObjektID,einen char= Art des Objekts als Buchstabe,char =MethodenID Methode die verwendet wird , string* = Parameter für die Methoden und alle 4 Sachen müssen irgendwie zueinander zugeordnet werden.Da hat sich meiner Meinung nach nur eine Klasse angeboten.
    Es ist ein Grafik Programm und hat eine Init Methode in dem alle Objekte schon mal initialisiert werden und eine Tick Methode die für jedes mal wenn sie ausgeführt wird sozusagen den neuen Zustand des Bildes anzeigt. Also die Init Methode wird nur einmal ausgeführt und die Tick steht bei einer Maßeinheit wie fps (frame per second) für den Frame der angezeigt wird.Allerdings kann man in der Tick auch neue Objekte initialisieren.

    Das ganze wird dann zu einem riesigen String zusammengebaut und an meinen Client geschickt.

    Dieser baut sich das Objekt Array dann wieder selber bei sich auf und soll dann auch dasselbe machen wie mein Master, mit ein paar kleinen Änderungen die ich vielleicht vorher in einer .cfg definiere.
    Also er baut sich halt dann aus dem Buchstaben(Art bzw Klasse) und der eindeutigen ID einen Variablennamen für ein Objekt einer Klasse zusammen und führt dann mit der Methoden ID die Methode aus.

    ART_OID->MID(PARAM1,PARAM2,PARAM3...);
    bzw.
    return(art)return(oid)->return(mid)(return(param1),...)

    Ach ja und ich kann problemlos zur Laufzeit Objekte erstellen und ihre Methoden nutzen. Das steht schon alles :o

    Ich glaub ich mach das ein wenig umständlich. wie ich schon mal gehört habe würde sich das Factory Pattern für so was anbieten. Aber das muss ich mir noch mal ansehen. Habt ihr denn Ideen wie man sowas löst ?

    Das ganze ist übrigens nicht kommerziell was ich da tue 🙂
    Aber wird für die Lehre verwendet.

    Jedem der hier gute Ideen bringt bekommt von mir einen ausgegeben 🙂

    EDIT:
    Fragen die sich jetzt für mich ergeben. Mal von meinem umständlichen Lösungsansatz abgesehen.

    1.erstellen von Objekten mit einem string als namen.(siehe oben)
    2.Kann ich in einer klasse ein array von strings erstellen ohne zu wissen wie viele es sein werden. (dynamisch sozusagen) (gilt für meine Klasse in der ich jedes objekt mit ID + ihren param usw eintrage.)(alternative Lösungswege)



  • 😞



  • Wie Sone bereits gesagt hat, kann man keine dynamischen Variablennamen machen.
    std::map ist ein Container (so ähnlich wie ein Array), in dem man bestimmte Werte einem selbstgewählten Schlüssel zuordnen kann.

    einen char = Art des Objekts als Buchstabe,char =MethodenID

    Benutze für die Art des Objekts enum, das ist technisch gesehen das gleiche, aber weniger fehleranfälliger und wesentlich übersichtlicher.

    char MethodenID

    Wenn ich das richtig verstanden habe, dann ist das eine ganz schlechte Idee und du solltest stattdessen virtuelle Funktionen nutzen.

    Du könntest das so realisieren:

    enum TYP
    {
        TYP_A,
        TYP_B
    };
    
    class Klasse
    {
    public:
    // ...
        virtual void macheEtwas() = 0;
    };
    
    class A : public Klasse
    {
    public:
        virtual void macheEtwas()
        {
            std::cout<<"A\n";
        }
    };
    
    class B : public Klasse
    {
    public:
        virtual void macheEtwas()
        {
            int i;
            std::cin>>i;
            std::cout<<"Du hast "<<i<<" eingegeben!\n";
        }
    };
    
    class Factory
    {
    public:
        Klasse *neuesObject(TYP t)
        {
            switch (t)
            {
            case TYP_A:
                return new A();
            case TYP_B:
                return new B();
            }
        }
    };
    

  • Mod

    Muss die ID eine Zeichenkette sein? Es wäre doch sehr viel einfacher, intern mit Ganzzahlen als IDs zu arbeiten, weil Computer damit sehr viel einfacher und schneller umgehen können. Wenn es an irgendeiner Stelle menschenlesbar sein soll (ein Mensch kommt wohl besser mit Objekt "Kreis_3" als mit Objekt 6589348 zurecht), dann kann man noch eine Übersetzungstabelle für die IDs zu menschenlesbaren Bezeichnern machen. Das kann dann eine map sein oder eine sortierte Liste der IDs oder eine andere Datenstruktur, je nach genauer Benutzung der IDs.



  • @seppj stimmt du hast recht. Ich weiß gar nicht mehr genau warum ich da einen char wollte.

    Edit: ah jetzt weiß ich es wieder. Ich dachte ich spar mir dadurch ein wenig Speicherplatz, ich hab ja nicht so viele verschiedene Methoden pro Klasse. Ich dachte mir ich vergebe pro Methode in einer Klasse eine ID und kann die dadurch dann rufen und ein einziges char Zeichen braucht weniger als ein int.
    Macht das Sinn. Wobei ich jetzt erst mal versuche das von marthog zu verstehen 😃 bzw auf meine Anwendung anzupassen.

    @marthog ich versuch das mal son bisschen auf meine beispiele anzupassen und du sagst ob ich das so machen könnte.
    Also ich hab ja schon Klassen vorgeben mit allen möglichen Methoden. Teilweise hat eine dieser Klassen 40 verschiedene Methoden. Wobei ich vermutlich nicht alle brauche.
    Ich hab ca 20 verschiedene Klassen mit ähnlichen Methoden.
    Ich schreibe also einen Adapter (deine "Klasse" oder?) mit den Methoden die ich brauche und sorg dann dafür das meine 20 Klassen die ich schon habe davon erben.
    Was macht dann die Factory bei dir ganz genau ? ach gott ich bring das einfach nicht hin 😞
    Wie schaff ich es denn dann das mein client genau das macht was mein master macht wie kann ich die methoden den verschiedenen objekten zuorden ?


  • Mod

    dashu schrieb:

    @seppj stimmt du hast recht. Ich weiß gar nicht mehr genau warum ich da einen char wollte.

    Edit: ah jetzt weiß ich es wieder. Ich dachte ich spar mir dadurch ein wenig Speicherplatz, ich hab ja nicht so viele verschiedene Methoden pro Klasse. Ich dachte mir ich vergebe pro Methode in einer Klasse eine ID und kann die dadurch dann rufen und ein einziges char Zeichen braucht weniger als ein int.

    Wie kommst du denn jetzt auf einzelne chars? Ich dachte, du redest von Zeichenketten? Dir ist schon bewusst, dass ein einzelner Buchstabe und eine Buchstabenfolge zwei ganz verschiedene Dinge sind? Ein char ist in C++ bloß eine Art kleinerer int. Das kann schon Sinn machen, Speicherplatz zu sparen, indem man char statt int benutzt, wenn (und nur dann!) man wirklich am allerletzten Byte des Speichers knabbert (wirklich? Ich kann mir echt nicht vorstellen, dass das bei dir der Fall ist).



  • Ja ich meine wirklich nur einen einzigen char als MethodenID.
    Ich dachte mir halt mehr brauch ich eh nicht. Auch wenn ich noch nicht an den letzten Speicher reserven knappere wollte ich einfach nicht mehr verwenden.

    Ist es nicht egal ob ich einen char oder einen int verwende ?


  • Mod

    dashu schrieb:

    Ist es nicht egal ob ich einen char oder einen int verwende ?

    Ja, ein char und ein int sind prinzipiell das gleiche, bloß mit anderem Wertebereich. Du hast bloß jeden Leser hoffnungslos verwirrt, dadurch, dass du nach strings gefragt hast. strings sind ganz was anderes.



  • @marthog Hab mir dank dir factory nochmal ein wenig angeschaut und ich verstehe jetzt denk ich wie ich das bei mir einsetzen kann.

    Danke nochmal an alle für die Denkanstöße.


Anmelden zum Antworten