2016-05-05 3 views
2

Ich eingefügt Strings und Person Objekte in einer Karte.C++ Wie kann man auf die Mitgliederdaten eines Objekts in einer Map zugreifen und diese ändern?

map <string,Person> _userList; 

jedoch in meinen Methoden, wenn ich versuche, etwas in der Person-Klasse hinzuzufügen, oder es ist Daten Mitglied in der Karte zu ändern, kann ich nicht mehr darauf zugreifen. Das ist, weil, wenn ich einen Iterator benutze und es durch Drucken i-> Sekunde, die Personenklasse, auf die ich zeige, BLANK Informationen hat. Alle Informationen dieser Person Objekte sind ERASED (oder so denke ich). Ich verstehe nicht wirklich warum. Mein Ziel ist es, die Listen (Mitgliederdaten) der Person Objekte in der Karte auszudrucken. Ich kann es nicht tun, wenn ich dieses Problem habe, weil es BLANK ausdrucken wird.

Hier ist die Code-Methode, die Strings und Person-Objekte in der Karte eingefügt:

void SocialNetwork::createPerson(string firstName, string lastName) 
{ 
    string fullName = firstName + " " + lastName; 
    //checks if the name is NOT A DUPLICATE 
    //iterate through _userList. _userList is a map 
    //if map is empty 
    if (_userList.empty()) 
    { 
     _user = new Person(firstName, lastName); 
     _userList.insert(make_pair(fullName, *_user)); 
     _numUsers++; 
    } 
    else 
    { 
     bool matchFound = false; 
     //USE MAP COUNT TO SEE IF THE PERSON ALREADY EXISTS IN THE MAP 
     if(_userList.count(fullName)>0) 
     { 
      matchFound = true; 
      cout << "Error: Name already exists" << endl; 
     } 
     else 
     { 
      _user = new Person(firstName, lastName); 
      _userList.insert(make_pair(fullName, *_user)); 
      _numUsers++; 
     } 
    } 
} 

Hier ist Beispielcode für ein Verfahren, das eine Liste in einer Person-Klasse unten zu drucken versucht:

void SocialNetwork::listPending(string personsFirst, string personsLast) 
{ 
    //prints list of pending Friend Requests 
    string personsFullName = personsFirst + " " + personsLast; 
    //check if this user exists 
    bool userExists = false; 
    if (_userList.empty()) 
    { 
     cout << "Error: Person does not exist" << endl; 
    } 
    else 
    { 
     if(_userList.count(personsFullName)>0) 
     { 
      userExists = true; 
     } 
     if (!userExists) 
     { 
      cout << "Error: Person does not exist" << endl; 
     } 
     else 
     { 
      map<string,Person>::iterator i = _userList.begin(); 
      bool personFound = false; 
      while (!personFound) 
      { 
       if(i != _userList.end()) 
       { 
        if(i->first == personsFullName) 
        { 
         //PROBLEM IS HERE 
         personFound = true; 
         cout << i->second <<endl; //Test Code. Delete later. How come their Person class is left BLANK? 
         i->second.printPendingRequestList(); //How come the list is left BLANK? 
        } 
        i++; 
       } 
      } 
     } 
    } 
} 

Und hier ist die printPendingRequestList Methode in der Klasse Person:

void Person::printPendingRequestList() 
{ 
    string test = _fullName; 
    cout << _fullName << "'s pending list" << endl; 
    queue<Person> toPrintQueue = _friendRequests; 

    while (!toPrintQueue.empty()) 
    { 
     cout << toPrintQueue.front().getFullName() << endl; 
     toPrintQueue.pop(); 
    } 
    cout << endl; 
} 

Dies ist die Ausgabe ich es empfangen sollte die Person, die ersten Namen haben, Nachname, und alle anderen Informationen, aber nein, es ist standardmäßig oder leer gelassen:

First Name: 
Last Name: 
Full Name: 
Number of Friends: 0 
Number of people they blocked: 0 
Friend Requests: 


Friend List: 

Block List: 

Personal Message List: 

's pending list 

Bitte helfen

+0

Sind die Inhalte der Karte korrekt direkt nach dem Aufruf 'einfügen()'? Da Sie Person * bei der Übergabe an 'make_pair()' außerdem dereferenzieren, wird der Kopierkonstruktor für 'Person' aufgerufen. Verwendet 'Person' den Standard-Kopierkonstruktor? Wenn nicht, haben Sie verifiziert, dass es richtig funktioniert? – Andy

+2

ist es ein Eindruck, oder haben Sie Speicherlecks? – Christophe

+0

Warum ordnen Sie '_user' auf dem Heap mit' new' zu? –

Antwort

4

Ihre ganze createPerson Funktion ist schlecht geschrieben. Zunächst erzeugt es dynamisch ein Objekt und verliert sofort den Zeiger darauf - was zu einem Speicherleck führt. Zweitens dupliziert Code unnötig. Dies ist eine bessere Version davon:

void SocialNetwork::createPerson(string firstName, string lastName) 
{ 
    string fullName = firstName + " " + lastName; 
    auto it = _userList.find(fullName); 
    if (it != _userList.end() { 
     _userList.emplace(fullName, firstName, lastName); 
     _numUsers++; 
    } else { 
     cout << "Error: Name already exists" << endl; 
    } 
} 
Verwandte Themen