gpt4 book ai didi

c++ - 指针为什么不存储和打印与应该匹配的对象相同的数据? (C++)

转载 作者:行者123 更新时间:2023-12-02 10:16:37 24 4
gpt4 key购买 nike

我正在制作一个游戏,允许用户从从文本文件读取的Player对象的 vector 中选择Player对象。

我要求用户输入一个名称,以便从 bootstrap 中选择一个玩家,然后遍历 bootstrap 以查找匹配的名称(假设每个玩家都有不同的名称)。

一旦它们匹配,我想将Player player1指针指向播放器 vector 中的该对象。

但是,找到匹配项后,player1指针未在for循环外打印正确的名称。指针默认是每次时在文本文件中打印最后一个播放器的名称,而不是与用户输入匹配的播放器的名称。

我该怎么做才能解决此问题?

vector<Player> playerVectorReadIn;
Player *player1; string name="";

//reading in the data

ifstream inFile;

inFile.open("playerData.txt");
if(!inFile){
cout<<"Error! Unable to open file";
exit(1);
}
while(inFile>>name){
Player playerObject(name);
playerVectorReadIn.push_back(playerObject);
}
inFile.close();

//finding matching data in vector

cout<<"\n\tEnter the name of the player from the list you choose: ";
getline(cin,name);

for(Player p:playerVectorReadIn){
if(p.getName()==name){
flag=true;
player1=&p; //setting pointer to player - https://stackoverflow.com/questions/2988273/c-pointer-to-objects
cout<<name; //the user entered name (example Bob)
cout<<p.getName(); //the matching name in the vector (Bob)
//both print the same name here so it works
}
}

if(flag==true){
cout<<"\nYou will be playing as: "<<player1->getName();
//prints as the name of the last object in the text file (example Ryan)
//not the matching name as above - why?
}else{
cout<<"\nPlayer not found.";
}
flag=false; name="";

文本文件内容示例:
Dave 
Jill
Bob
Mary
Donna
Ryan

最佳答案

for(Player p:playerVectorReadIn){

这是按值迭代的, p是此 for循环范围内的本地对象,并且是 vector 中该对象的副本。每次此循环迭代时,此对象都会被销毁。如果循环再次迭代,则会创建一个新的 p对象。
     player1=&p;

这将保存一个指向该本地对象的指针。但是,正如我们刚刚发现的那样, p在循环结束时被销毁, player1成为指向被销毁对象的悬挂指针,随后使用它成为未定义的行为。

这说明了您正在观察的垃圾结果。幸运的是,该解决方案非常简单,可以通过引用进行迭代:
for(Player &p:playerVectorReadIn){
p现在是对 vector 中实际对象的引用,并且只要 vector 自身本身随后没有被重新分配,指向 vector 中对象的指针将保持有效。

关于c++ - 指针为什么不存储和打印与应该匹配的对象相同的数据? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61699961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com