2016-05-05 9 views
2

マップに文字列とPersonオブジェクトを挿入しました。C++マップ内のオブジェクトのメンバーデータにアクセスして変更する方法は?

map <string,Person> _userList; 

私はPersonクラスで何かを追加したり、それがマップ内のメンバーデータです変更しようとすると、しかし、私の方法では、私はもはやそれにアクセスすることができます。なぜなら、イテレータを使用して、 i-> secondを印刷してテストすると、私が指しているPersonクラスにはBLANK情報があるからです。それらのPersonオブジェクトのすべての情報は消去されています(または私はそう思います)。 なぜ私は本当に理解できません。 私の目標は、マップ内のPersonオブジェクトのリスト(メンバーデータ)を印刷することです。私はこの問題を抱えている時にそれをすることができません。ここ

は、マップ内の文字列とPersonオブジェクトを挿入するコード方法であって、ここで

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++; 
     } 
    } 
} 

は、以下のPersonクラスにリストを印刷しようとする方法のサンプルコードである。

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++; 
       } 
      } 
     } 
    } 
} 

そしてここでPersonクラスでprintPendingRequestListメソッドです:

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; 
} 

これは、その人の姓、名、および他のすべての情報を持っているはずだが、いや、それはデフォルトまたは空白のままにされ、私が受け取った出力です:

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 

+0

'insert()'の呼び出しの直後に地図の内容が正しいですか?また、 'make_pair()'に渡すときにPerson *を参照解除するので、 'Person'のコピーコンストラクタが呼び出されます。 'Person'はデフォルトのコピーコンストラクタを使用していますか?そうでない場合は、正しく動作することを確認しましたか? – Andy

+2

それは印象ですか、あるいはメモリリークがありますか? – Christophe

+0

'new 'を使って' _user'をヒープに割り当てているのはなぜですか? –

答えて

4

あなたの全体createPersonを助けてください機能がひどく書かれています。まず第一に、オブジェクトを動的に作成し、そのオブジェクトへのポインタを直ちに失うため、メモリリークが発生します。もう一つは、不要なコードを複製することです。これはより良いバージョンです:

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; 
    } 
} 
関連する問題