Problem mit klassen std::map



  • Hi leute, ich hätte mal eine frage:
    Warum und für was genau benötigt std::map, wenn einer der beiden basis typen eine klasse ist, von dieser klasse einen constructor, der keine argumente benötigt?
    Ein Beispiel zur verständlichung:

    #include <string>
    #include <map>
    using namespace std;
    
    class MyClass 
    {
    public:
        MyClass( string DummyArgument )
        {
    
        }
    };
    
    int main( int argc, char *argv[] ) 
    {
        map<string, myClass> myMap;
    
        MyClass object = MyClass("")
        myMap["eins"] = object; 
    }
    

    Der o.g. Code würde funktionieren, wenn MyClass den constructor MyClass() hätte, aber da sie nur einen hat, der ein argument benötigt, schlägt das ganze schon beim compilieren fehl. Folgende Fehlermeldung gibts dazu:

    C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\map(173) : error C2512: 'MyClass::MyClass': Kein geeigneter Standardkonstruktor verfügbar
    

    Die frage ist also: Warum genau wird dieser constructor benötigt?



  • myMap["eins"]
    

    muss eine Referenz auf ein Objekt vom Typ MyClass zurückgeben, damit du es überschreiben kannst. Um dieses "Dummy-Objekt" zu erstellen, braucht std::map vermutlich einen Standardkonstruktor.

    PS: Bitte [cpp]-Tag und nicht [code]-Tag verwenden, da ist das Syntax-Highlighting besser.


  • Mod

    Was wxSkip sagt.

    Und hier der Workaround:

    myMap.insert(pair<string, MyClass>("eins", object));
    


  • myMap["eins"] Erzeugt ein neues Key-Value-Paar. Dabei ist der value eben vom Typ myClass, und der wird mittels Default-Ctor erzeugt. Der Standard besagt eben, dass std::map so nur mit default-konstruierbaren Objekten benutzt werden kann. Du könntest per insert ein fertiges key-value-Paar einfügen, statt auf op[] zurückzugreifen:

    #include <string>
    #include <map>
    using namespace std;
    
    class MyClass
    {
    public:
        MyClass( string DummyArgument )
        {
    
        }
    };
    
    int main( int argc, char *argv[] )
    {
        map<string, myClass> myMap;
    
        MyClass object = MyClass("")
        myMap.insert(std::make_pair(std::string("eins"), object));
    }
    

    Allerdings weiß ich nicht genau, welche Methoen von map ohne default-konstruierbare Objekte möglich sind.
    Oder du gibst deiner Klasse einen default-Parameter (z.B. std::string("")) für den Konstruktor.



  • SeppJ schrieb:

    Und hier der Workaround:

    myMap.insert(pair<string, MyClass>("eins", object));
    

    Ich würde das nicht als Workaround, sondern als besser Lösung bezeichen.



  • jop das ist es wohl, viele dank für die lösung!


Anmelden zum Antworten