Variable im Funktionsnamen



  • hi,

    geht das auch mit klassen?

    also

    class foobar {
      ...
      int bla() {
        ...
      }
    }
    
    int main()
    {
        ????
        handle = foobar;
    
        (*handle) test;
        test.bla();
    
    }
    

    das wär perfekt!



  • Hallo,

    Lese doch mal was zum Thema Polymorphie bzw. virtuelle Methoden. Das sollte dir hier helfen.
    http://tutorial.schornboeck.net/virtual.htm



  • Hallo,

    Lese doch mal was zum Thema Polymorphie bzw. virtuelle Methoden. Das sollte dir hier helfen.
    http://tutorial.schornboeck.net/virtual.htm

    Hey, danke für den Link!
    Klappt mit jetzt!

    Andere Frage,

    Brauche etwas in dieser Form:

    array[0]["foo"] = "bla";
    array[0]["bar"] = "bla";
    array[1]["foo"] = "bla";
    array[1]["bar"] = "bla";
    array[1]["go"] = "bla";
    array[2]["la"] = "bla";

    also
    array[ int ] [ string ] = string

    Habs mit Maps versucht, aber bekomme die Definition nicht richtig hin. 😞



  • std::vector<std::map<std::string, std::string> > array;
    

    ?



  • ja, so hatt ichs auch schon probiert, aber beim aufruf:

    std::vector<std::map<std::string, std::string> > array;
    
    		 array[0]["bla"] = "foo";
    

    bekomm ich immer einen Speicherzugriffsfehler.
    Wenn ich die zweite Zeile rausnehme, gehts.



  • Er möchte ein Schlüssel-Wert-Paar als Key. 0 kommt bei dem Beispiel mehrfach vor, allerdings kommt der String nur einmal vor, da sollte es wohl eher so aussehen:

    std::map<std::pair<int, std::string>, std::string> mMap;
    // Beispiel:
    mMap[std::make_pair(0, "foo")] = "bla";
    mMap[std::make_pair(0, "bar")] = "blubb";
    cout << mMap[std::make_pair(0, "foo")] << endl;
    cout << mMap[std::make_pair(0, "bar")] << endl;
    

    Wenn der Key mehrfach vorkommen soll (also, dass auch der string des pairs mehrfach gleich wäre), dann ist ne multimap zu nehmen.

    Edit:
    Oder so wohl doch besser so ^^:

    std::vector<std::map<std::string, std::string> > array;
    array.push_back(std::map<std::string, std::string>());
    array[0].insert(make_pair("foo", "bla"));
    array[0].insert(make_pair("bar", "blubb"));
    cout << array[0]["foo"] << endl;
    

    Du musst immer eine map pushen bevor du diese dann benutzen kannst und über einen Index darauf zugreifen kannst.

    Greetz



  • Maddes schrieb:

    bekomm ich immer einen Speicherzugriffsfehler.
    Wenn ich die zweite Zeile rausnehme, gehts.

    Klar, weil dein array zunächst leer ist. Ein Aufruf von array.resize(gewuenschte_groesse); vor dem Zugriff sollte das Problem lösen.



  • array.resize(gewuenschte_groesse)

    AAAAAAAAAAAHHHHHHHHHHHHHHHHHHHHHHHHHHHHH!!!!!!!!!

    Tausend Dank! 👍
    Werd mich doch noch ein wenig mit Vectoren/Maps beschäftigen müssen 🙂



  • Man kann die Größe auch gleich im Konstruktor angeben, dann kann man sich das resize ersparen:

    std::vector<std::map<std::string, std::string> > array(10);
    array[0] = std::map<std::string, std::string>();
    array[0].insert(make_pair("foo", "bla"));
    

    Greetz



  • array[0] = std::map<std::string, std::string>();
    

    Ist diese Zweile wirklich nötig? Sollte nicht schon der Konstruktor von std::vector dafür sorgen, dass die Konstruktoren der Elemente aufgerufen werden?



  • ah okay.
    gut zu wissen.

    da ich bei der initialisierung aber die größe noch nicht weiss, ist resize schon genau das richtige 🙂



  • Der Meister schrieb:

    array[0] = std::map<std::string, std::string>();
    

    Ist diese Zweile wirklich nötig? Sollte nicht schon der Konstruktor von std::vector dafür sorgen, dass die Konstruktoren der Elemente aufgerufen werden?

    Jupp, wenn man die Größe angegeben hat ist die Zeile überflüssig. Da werden in meinem Beispiel 10 leere maps angelegt.
    Bei der push_back-Methode, die ich auch einem ständigen resize evtl. bevorzugen würde, muss einmal eine map gepushed werden, da ist ja auch noch nichts initialisiert.

    Greetz


Anmelden zum Antworten