2016-08-01 12 views
0

Was das Problem in folgendem Programm ist, warum ich nicht in der Lage bin Karte mit Klasse als KeyWie kann ich einfügen Schlüssel als eine Klasse in der Karte STL in C++

#include <iostream> 
#include <map> 

#include <utility> 

using namespace std; 

class User 
{ 
    int value_1; 
    int value_2; 
public: 
    User(int num_1, int num_2) 
    { 
     value_1 = num_1; 
     value_2 = num_2; 
    } 
    int getId(){ 
     return value_1; 
    } 
    int getUid(){ 
     return value_2; 
    } 
    bool operator< (const User& userObj) const 
    { 
     if(userObj.value_1 < this->value_1) 
      return true; 
    } 
}; 

int main() 
{ 
    std::map<User, int> m_UserInfoMap; 

    m_UserInfoMap.insert(std::make_pair<User, int>(User(1,2), 100)); 
    m_UserInfoMap.insert(std::make_pair<User, int>(User(3,4), 120)); 
    m_UserInfoMap.insert(std::make_pair<User, int>(User(5,6), 300)); 
    std::map<User, int>::iterator it = m_UserInfoMap.begin(); 
    for(; it != m_UserInfoMap.end(); it++) 
    { 
     std::cout<<it->first.getId()<<" :: "<<it->second<<std::endl; 
    } 
    return 0; 
} 

In oben Programm zu initialisieren, wenn ich versuche, um Schlüssel als Klasse hinzuzufügen, gibt es einen Fehler. Und bitte sagen Sie verschiedene Möglichkeiten, um Karte zu initialisieren.

+0

wenn ich versuche, Karte initialisieren Like: m_UserInfoMap [a] = 1; es ordnungsgemäß funktioniert“ aber wenn std :: map m_UserInfoMap = (a, 1), oder std :: map m_UserInfoMap (a, 1); es nicht funktioniert, so was ist mit obigen Aussagen worng –

+0

? Wir werden die Arbeit Ihres Compilers * nicht wieder * machen * .Posten Sie den Fehler – nvoigt

+1

Schalten Sie Ihre Warnstufen ein Sie haben einen trivialen Fehler: eine nicht-void-Funktion * immer * muss etwas zurückgeben – juanchopanza

Antwort

5

std::map 's value_type ist std::pair<const Key, T>, bedeutet Schlüssel werden als const gespeichert. Sie können also keine nicht-konstanten Elementfunktionen wie std::cout<<it->first.getId() aufrufen.

Sie sollten User::getId() (und User::getUid()) zu const Elementfunktionen ändern. Wie zum Beispiel:

int getId() const { 
//   ~~~~~ 
    return value_1; 
} 
int getUid() const { 
//   ~~~~~ 
    return value_2; 
} 

BTW: Du hast nichts zurück, wenn if Zustand in operator< ausfällt.

bool operator< (const User& userObj) const 
{ 
    if(userObj.value_1 < this->value_1) 
     return true; 
    else 
     return false; // return for else case 
} 

oder nur

bool operator< (const User& userObj) const 
{ 
    return userObj.value_1 < this->value_1; 
} 
+1

'if (condition) return true; sonst gib false zurück; 'ist schlechter Stil, besser, solche Sachen überhaupt nicht zu zeigen ... – Aconcagua

+1

@Aconcagua stimme ich dem zu. Ich möchte emphasize, dass OP auch etw für den impliziten anderen Fall zurückgeben sollte. Jedenfalls habe ich endlich den einfachsten geschrieben. :) – songyuanyao

1

Zunächst sollten Sie Ihren Betreiber immer machen einen Wert zurückgeben:

bool operator< (const User& userObj) const 
{ 
    return userObj.value_1 < this->value_1; 
} 

Sind Sie sicher, dass Sie wirklich x < y als y.value < x.value vergleichen wollen? Andernfalls müssen Sie innerhalb des Vergleichs ändern:

bool operator< (const User& userObj) const 
{ 
    return this->value_1 < userObj.value_1; 
} 

Und während diese Antwort zu schreiben, songyuanyao war schneller als ich für den zweiten Teil, haben so einen Blick auf seine Antwort ...