2011-01-12 8 views
2

Ich kann eine Methode einer Klasse in einem Set-Iterator bekommen?Objekt in einem Set-Iterator

#include <iostream> 
#include <string> 
#include <set> 
class student{ 
    public: 
    student(std::string n){ 
     name=n; 
    } 
    void print(){ 
     std::cout << name << std::endl; 
    } 
    bool operator < (const student & s1){ return true;} 
    bool operator = (const student & s1){ return true;} 
    private: 
    std::string name; 
}; 
int main(){ 
    std::set<student> studs; 
    studs.insert(student("name01")); 
    studs.insert(student("name02")); 
    std::set<student>::iterator it; 
    for(it = studs.begin(); it != studs.end(); it++) 
     (*it).print() ; 
} 

Ich erhalte diese Fehler

students.cpp: In function ‘int main()’: 
students.cpp:22: error: passing ‘const student’ as ‘this’ argument of ‘void student::print()’ discards qualifiers 
/usr/include/c++/4.2.1/bits/stl_function.h: In member function ‘bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = student]’: 
/usr/include/c++/4.2.1/bits/stl_tree.h:982: instantiated from ‘std::pair<typename std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(const _Val&) [with _Key = student, _Val = student, _KeyOfValue = std::_Identity<student>, _Compare = std::less<student>, _Alloc = std::allocator<student>]’ 
/usr/include/c++/4.2.1/bits/stl_set.h:307: instantiated from ‘std::pair<typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, typename _Alloc::rebind<_Key>::other>::const_iterator, bool> std::set<_Key, _Compare, _Alloc>::insert(const _Key&) [with _Key = student, _Compare = std::less<student>, _Alloc = std::allocator<student>]’ 
students.cpp:18: instantiated from here 
/usr/include/c++/4.2.1/bits/stl_function.h:227: error: passing ‘const student’ as ‘this’ argument of ‘bool student::operator<(const student&)’ discards qualifiers 

mit

 bool operator<(const student & s1) const { return true;} 
    bool operator==(const student & s1) const { return true;} 

jetzt arbeiten !! O_o ',

#include <iostream> 
#include <string> 
#include <set> 
class student{ 
    public: 
    student(std::string n){ 
     name=n; 
    } 
    void print() const { 
     std::cout << name << std::endl; 
    } 
    bool operator<(const student & s1) const { return true;} 
    bool operator==(const student & s1) const { return true;} 
    private: 
    std::string name; 
}; 
int main(){ 
    std::set<student> studs; 
    studs.insert(student("name01")); 
    studs.insert(student("name02")); 
    std::set<student>::iterator it; 
    for(it = studs.begin(); it != studs.end(); it++) 
     it->print() ; 
} 
+0

Können Sie Ihre Frage anders formulieren? Was auch immer du tust, scheint in Ordnung zu sein. Also, wo liegt das Problem? – Nawaz

+0

Ich denke, Sie wollten 'operator ==', nicht 'operator =' überladen. – suszterpatt

+0

Ich denke du meinst 'bool operator ==' da. –

Antwort

5

Sie benötigen einen const Qualifer auf Ihre print Member-Funktion hinzuzufügen:

void print() const 
{ 
    std::cout << name << std::endl; 
} 

Objekte in einem std::set sind notwendigerweise const, da sie als Schlüssel verwendet werden. Wenn ein Objekt (oder eine Referenz) konstant ist, können Sie nur Member-Funktionen dieses Objekts aufrufen, die mit dem Qualifier const deklariert sind.

Sie möchten auch const Qualifier auf den == und < Operator Überlastfunktionen. (Und vergessen Sie nicht =-== zu ändern, wie in den Kommentaren darauf hingewiesen.)

3

Ja, obwohl it->print() ist intuitiver.

Eine naive Weltansicht ist, dass Iteratoren ein bisschen wie Zeiger sind. Es gibt mehr als das, wie erklärt here.

Die naheliegendste Form Iterator ist ein Zeiger : Ein Zeiger auf Elemente in einem Array zeigen kann, und kann durch sie iterieren das Inkrement Operator (++). Aber andere Formen von Iteratoren existieren. Zum Beispiel hat jeder Containertyp (wie ein Vektor) einen spezifischen Iteratortyp, der entworfen wurde, um seine Elemente in effizienter Weise zu durchlaufen.

+0

mit it-> print() oder (* it) .print(). Ich bekomme den gleichen Fehler – JuanPablo

+0

Der Fehler ist nicht im Zusammenhang mit dieser Verwendung, siehe @Charles Salvia die Lösung für die Lösung. –

1

Schreiben Sie print() Funktion wie folgt aus:

void print() const //<---- note this 'const' 
{ 
     std::cout << name << std::endl; 
} 

Jetzt Ihr Code sollte jetzt funktionieren. :-)

Übrigens, solche Funktionen mit const Schlüsselwort, das auf der rechten Seite erscheint, werden const Mitgliedsfunktion genannt, da sie keine Mitgliedsdaten der Klasse ändern können.

diese häufig gestellten Fragen: [18.10] What is a "const member function"?

2
  1. Sie wollen Operator ==, nicht Operator =.

  2. Ihr Operator < Definition verletzt die Anforderungen von std :: set und ist nicht mit Ihrem Operator kompatibel <. Das heißt, nach Ihrem Operator <, nichts ist gleichwertig, aber nach Ihrem Operator ==, ist alles gleich.Der Operator < sollte eine irreflexive, transitive und asymmetrische (für nicht äquivalente Werte) Relation definieren.

  3. Objekte in einer Menge sind notwendigerweise const, und um eine Funktion für ein solches Objekt aufzurufen, muss diese Funktion mit dem Qualifikationsmerkmal const deklariert werden. Insbesondere sollte print() void print() const deklariert werden.

  4. In ähnlicher Weise sollte der Operator < mit dem Qualifikationsmerkmal const deklariert werden. std :: set erfordert, dass der Operator < mit const-Objekten aufgerufen werden kann. Eine weitere gültige Option wäre, den Operator < zu einer Nichtmitgliedsfunktion zu machen und beide Objekte nach Wert (schlecht) oder Konstantenbezug (gut) zu übernehmen.

  5. Während in Ihrem Beispiel nicht erforderlich, sollte operator == auch mit dem Qualifikationsmerkmal const deklariert werden.

0
#include <iostream> 
#include <set> 
using namespace std; 
class Boxer{ 
    public: 
     string name; 
     int strength; 
}; 
struct Comp{ 
    bool operator()(const Boxer& a, const Boxer& b){ 
     return a.strength > b.strength; 
    } 
}; 
int main(){ 
    Boxer boxer[3]; 
    boxer[0].name="uday", boxer[0].strength=23; 
    boxer[1].name="manoj", boxer[1].strength=33; 
    boxer[2].name="rajiv", boxer[2].strength=13; 

    set< Boxer, Comp> s; 
    s.insert(boxer[0]); 
    s.insert(boxer[1]); 
    s.insert(boxer[2]); 
    set< Boxer, Comp>::iterator it = s.begin(); 
    Boxer b = *it; 
    cout<<b.name; 
    //result is Manoj 

    return 0; 
}