Inhalt von StringContainer als Funktionsaufruf verwenden



  • So komisch der Titel auch klingen mag. Ich bin noch ziemlicher Anfänger im C++.
    Jetzt mein Problem.
    Ich habe eine for-schleife die jede Zeile vom Container durchgeht und der Inhalt der Zeile ist jeweils der Klassenname, welche die 2. for-schleife mit einer Funktion aufrufen soll. Das Problem ist, dass der Inhalt, also der Klassenname nicht "erkannt" wird.
    Meine Frage: ist dies möglich den Inhalt vom Container als "reiner Text" darzustellen, damit dieser auch als Klassenname erkannt wird?

    FunktionsContainer.push_back("HorizontalVorwaerts");
    	FunktionsContainer.push_back("HorizontalRueckwaerts");
    	FunktionsContainer.push_back("VertikalAbwaerts");
    	FunktionsContainer.push_back("VertikalAufwaerts");
    	FunktionsContainer.push_back("DiagonalAbwaertsRechts");
    	FunktionsContainer.push_back("DiagonalAufwaertsLinks");
    	FunktionsContainer.push_back("DiagonalAufwaertsRechts");
    
    	for(int FunktionsZuweiser = 0; FunktionsZuweiser < FunktionsContainer.size(); FunktionsZuweiser++)
    	{
    		for(int Wortlieferer = 0; Wortlieferer < SuchwortContainer.size(); Wortlieferer++)
    		{
    			FunktionsContainer[FunktionsZuweiser].Suchfunktion(SuchwortContainer[Wortlieferer]);
    		}
    	}
    


  • Du willst also, mittels des Klassennamen, ein Objekt der Klasse erzeugen? Problem an der Sache, nachdem Compiliert wurde, existieren die Klassennamen überhaupt nicht mehr in dem Kontext in dem du sie geschrieben hast, soll heißen zur Laufzeit kannst du nicht auf Klassennnamen als string zugreifen.



  • Also lediglich will ich eine Funktion von der Klasse (Vererbung) aufrufen.
    Vorher hatte ich für jeden Klassennamen (für alle, die im Container sind) eine for-Schleife. Jetzt wollte ich zur verschönerung des Codes eben so machen.
    (Vorher klappte dies, wie ich wollte) Also ich will einfach nur die Funktion aufrufen, und dazu brauche ich ja logischerweise den Kassennamen und diesen soll es vom Container nehmen, als wäre dieser normal vor der Funktion aufgeschrieben.
    Ist meine Frage verständlich?

    Im Moment wie ich es jetzt habe ist folgende Meldung:
    error C2039: 'Suchfunktion' : Ist kein Element von 'basic_string<char,struct std::char_traits<char>,class std::allocator<char> >'
    Weil es eben den Klassennamen nicht auflöst..

    Mfg und besten Dank für Lösungen



  • Ja jetzt ist es verständlich und das was du machen willst funktioniert nicht.Weil wie ich schon sagte, die Klassennamen als "rein text" wirst du nach dem Compiliervorgang nicht mehr kriegen.Du musst dazu Zeiger auf deine Basisklasse speichern und mit denen kannst du dann auf die Funktionen zugreifen. Oder du benutzt eine

    std::map<std::string/*für deinen Klassennamen*/, Basisklasse*>;
    


  • Also wie würde das mit der Referenz gehen?
    Nur zum testen hätte ich das so gemacht

    for(int FunktionsZuweiser = 0; FunktionsZuweiser < FunktionsContainer.size(); FunktionsZuweiser++)
    	{
    		for(int Wortlieferer = 0; Wortlieferer < SuchwortContainer.size(); Wortlieferer++)
    		{
    			/*FunktionsContainer[FunktionsZuweiser]*/&HorizontalVorwaerts.Suchfunktion(SuchwortContainer[Wortlieferer]);
    		}
    	}
    

    Aber es erscheint folgender Fehler:

    error C2102: '&' erwartet L-Wert

    Wie muss ich denn das machen?
    Und dein 2. Vorschlag habe ich nicht kapiert :S
    Besten Dank



  • Firefighter schrieb:

    std::map<std::string/*für deinen Klassennamen*/, ObjektDeinerKlasse&>;
    

    Das mit der Referenz geht so nicht. Man kann Referenzen nicht so ohne weiters in Container packen, da sie beim Anlegen auch gleich initialisiert werden müssen.

    Mal so zum Verständniss:
    Du hast verschiedene Klassen wie z.B. HorizontalVorwaerts, HorizontalRueckwaerts und VertikalAbwaerts? Oder sind das alles Objekte von der selben Klasse?



  • Als erstes musst du jegliche Referenzen auf Objekte deiner Klassen in deinen Container packen.Was aber nur geht, wenn du eine allgemeine Basisklasse hast, sonst müsstest du für jede Klasse einen eigenen container anlegen.Und danach kannst du durch den Container durchmarschieren wie in deiner ersten ausführung.



  • Firefighter schrieb:

    Als erstes musst du jegliche Referenzen auf Objekte deiner Klassen in deinen Container packen.

    Das geht immer noch nicht. 😉
    (Ich sehe grade, dass du Tachyons Antwort wohl kaum noch gelesen hast bei der Post-Zeit).

    Wohl aber mit Zeiger. Map ist eine gute Idee, also

    std::map<std::string, ObjektDeinerKlasse*> Map;
    

    Wie schon erwähnt wurde, musst du für Polymorphie eine Basisklasse haben. Die kann dann (rein) virtuelle Funktionen deklarieren, die in den abgeleiteten Klassen überschrieben werden. Dann kann man von den Zeigern im Container aus automatisch die richtigen Methoden aufrufen.

    Und immer schön dran denken, Destruktor virtuell zu machen. 🙂



  • Verwende doch einfach Funktoren wie z.B. boost::function<>.



  • @ Nexus. Ahh du hast Recht, den Post habe ich nicht gelesen. Natürlich mit Zeiger, ich war wohl gerade etwas nebenan, klaro Zeiger in die Map und dann macht der Polymorphismus alles für dich, unter der Voraussetzung das er eine gemeinsame Basiklasse hat.Ich werde mein eingansgpost dahingehend ändern.


Anmelden zum Antworten