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.


Log in to reply