マップに文字列と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
'insert()'の呼び出しの直後に地図の内容が正しいですか?また、 'make_pair()'に渡すときにPerson *を参照解除するので、 'Person'のコピーコンストラクタが呼び出されます。 'Person'はデフォルトのコピーコンストラクタを使用していますか?そうでない場合は、正しく動作することを確認しましたか? – Andy
それは印象ですか、あるいはメモリリークがありますか? – Christophe
'new 'を使って' _user'をヒープに割り当てているのはなぜですか? –