Methodenaufruf eines variablen Objektes



  • Weißt du überhaupt was ne map ist?



  • mapper schrieb:

    Weißt du überhaupt was ne map ist?

    Naja, ich denke schon. Zumindest weiss ich, wie ich sie anwende 😉
    Kann natürlich sein, dass ich da ne entscheidende sache noch nicht weiß... Warum sagst du mir nicht, was du meinst?



  • Sowas

    cin >> wort;
    theMap.find(wort).methode1();
    


  • Das funktioniert nicht

    main.cpp: In function »int main()«:
    main.cpp:83: Fehler: »struct std::_Rb_tree_iterator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, cClass> >« hat kein Element namens »method1«
    /usr/include/c++/4.1.3/bits/stl_map.h: In member function »_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = cClass, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, cClass> >]«:
    main.cpp:66:   instantiated from here
    /usr/include/c++/4.1.3/bits/stl_map.h:348: Fehler: keine passende Funktion für Aufruf von »cClass::cClass()«
    classes/cClass.h:6: Anmerkung: Kandidaten sind: cClass::cClass(std::string, std::string, int, int, int, int, int)
    classes/cClass.h:4: Anmerkung:                  cClass::cClass(const cClass&)
    


  • und der code dazu?



  • So in etwa:

    map<string, cClass> mapname;
    
    cClass foo;
    mapname["wort"] = foo;
    
    cin >> wort;
    mapname.find(wort).method1();
    


  • Wie wäre es mit einem Funktionszeiger?

    Edit:

    Hatten wir erst letztens

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-204341-and-highlight-is-.html



  • el primato schrieb:

    So in etwa:

    map<string, cClass> mapname;
    
    cClass foo;
    mapname["wort"] = foo;
    
    cin >> wort;
    mapname.find(wort).method1();
    

    Und hat cClass ne Methode method1? Oben was noch methode1.



  • Ach
    ->second.method1()



  • mapper schrieb:

    Und hat cClass ne Methode method1? Oben was noch methode1.

    Die namen hab ich nur für das beispiel ein wenig abgeändert. Bei mir stimmt das alles.

    Ach
    ->second.method1()

    Ich verstehe nicht ganz, was du mir damit sagen willst?

    Das mit dem funktionszeiger werd ich mir mal angucken. Danke für den link.



  • mapname.find(wort)->second.method1()



  • mapper schrieb:

    mapname.find(wort)->second.method1()

    Aber meine map heisst doch "mapname". Wieso muss da second stehen, kannst du mir das bitte erklären?
    Danke





  • die fehlermeldung oben besagt doch erstmal nur das: Deine Klasse cClass hat keinen standardkonstruktor (also einen ohne parameter). Objekte in einer map brauchen aber so einen.



  • mapper schrieb:

    mapname.find(wort)->second.method1()

    das ist ja gruselig, speicherzugriffsverletzung gleich eingebaut?
    machs wenigstens so:

    std::map<string, cClass>::iterator iter = mapname.find(wort);
    if( iter != mapname.end() )
      iter->second.method1();
    


  • thordk_ schrieb:

    mapper schrieb:

    mapname.find(wort)->second.method1()

    das ist ja gruselig, speicherzugriffsverletzung gleich eingebaut?

    [ausrede]
    Anfangs hat er auch behauptet, er weiß wie man ne map anwendet, da dachte ich es reicht die Idee zu zeigen.
    [/ausrede]



  • Sorry erstmal, dass ich das problem so lange liegen gelassen hab. Hatte in den letzten wochen keine zeit.

    Maxi schrieb:

    die fehlermeldung oben besagt doch erstmal nur das: Deine Klasse cClass hat keinen standardkonstruktor (also einen ohne parameter). Objekte in einer map brauchen aber so einen.

    Ja, soweit bin ich nun auch gekommen. Aber mein cClass hat einen standardkonstruktor mit parameter. Daher kann ich mir die fehlermeldung nicht erklären. Der konstruktor sieht so aus

    cClass::cClass(string name, string description) {
    	method2(name, description);
    }
    

    method1 (und method2 auch) kommen übrigens von einer elternklasse. Hats evtl damit was zu tun?
    Ich hab mir inzwischen auch nochmal genau die map angeguckt. Ich machs genauso wie ihr es mir geschrieben habt bzw wie es in der c++ reference als beispiel steht. Aber es bleibt bei der fehlermeldung:

    /usr/include/c++/4.1.3/bits/stl_map.h: In member function »_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = cClass, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, cClass> >]«:
    main.cpp:61: instantiated from here
    /usr/include/c++/4.1.3/bits/stl_map.h:348: Fehler: keine passende Funktion für Aufruf von »cClass::cClass()«
    classes/cClass.h:7: Anmerkung: Kandidaten sind: cClass::cClass(std::string, std::string)
    classes/cClass.h:5: Anmerkung: cClass::cClass(const cClass&)
    make: *** [main] Fehler 1



  • Du mußt der Klasse aber einen parameterlosen Konstruktor verpassen (diesen nennt man Standard-Konstruktor), da die Map beim Operator[] einen neuen (leeren) Eintrag anlegt, wenn der Wert nicht gefunden wurde.

    Alternativ kannst du auch deinen bisherigen Konstruktor mit Defaultparametern ausstatten, z.B.:

    cClass::cClass(string name = string(), string description = string())
    


  • sorry, hat sich erledigt....


Anmelden zum Antworten