c++ - 对象成员变量在函数中更新但不持久
问题描述
我对 C++ 和构建一个简单的战舰游戏相当陌生。我有一个函数,通过接收船舶对象的向量来初始化船舶类型和长度。我已经确认类型和船长正在函数内部更新,但更改并没有保留在主函数中。任何帮助将不胜感激。
#include <iostream>
#include <vector>
#include "ships.h"
#include "board.h"
#include "player.h"
using std::vector;
void initialize_ships(vector<ship> &newFleet)
{
vector<string> ship_types = { "carrier","battleship","submarine","cruiser","destroyer" };
for (auto ii = 0; ii != newFleet.size(); ++ii)
{
newFleet[ii].type = ship_types[ii];
newFleet[ii].setLength();
if (newFleet[ii].type == "carrier")
{
std::cout << "Carrier in function has type: " << newFleet[ii].type << std::endl;
}
}
}
int main()
{
ship player_carrier, player_battleship, player_submarine, player_cruiser, player_destroyer;
vector<ship> player_fleet = {player_carrier, player_battleship, player_submarine, player_cruiser, player_destroyer };
initialize_ships(player_fleet);
std::cout << "Carrier in main has type: " << player_carrier.type << std::endl;
system("pause");
return 0;
}
#ifndef SHIPS_H
#define SHIPS_H
#include <iostream>
#include <string>
using std::string;
struct ship
{
// ships member variables
int len;
char dir;
int health;
int row;
int col;
char symb;
string type;
void setLength()
{
if (type == "carrier")
{
len = 5;
}
else if (type == "battleship")
{
len = 4;
}
else if (type == "cruiser")
{
len = 3;
}
else if (type == "submarine")
{
len = 3;
}
else if (type == "destroyer")
{
len = 2;
}
else
{
std::cout << "Invalid ship type!" << std::endl;
}
}
};
#endif // SHIPS_H
解决方案
意外制作副本是更改“丢失”的常见原因。对于这种特殊情况,您希望在容器中拥有对象并为这些对象命名(就好像它们是类的成员一样),明智的做法是引用容器中的对象:
vector<ship> player_fleet(5);
ship &player_carrier=player_fleet[0],
&player_battleship=player_fleet[1],
&player_submarine=player_fleet[2],
&player_cruiser=player_fleet[3],
&player_destroyer=player_fleet[4];
小心不要导致vector
重新分配,因为这会使您的引用无效。(当然,如果它从不改变大小,ship player_fleet[5];
就足够了。)
推荐阅读
- python - flask_uploads:ImportError:无法导入名称“secure_filename”
- shell - UNIX:从分隔的文本文件创建表格格式的输出
- angular - Angular 如何在不同的单元测试中更新模拟数据
- c++ - 以分钟为单位查找本地时区与 GMT 的差异
- r - 从 excel 和 R 映射数据集
- javascript - 如何在javascript中的数组内添加字典
- javascript - 我必须在元素上注册哪种事件类型以跟踪添加子元素
- visual-studio-code - 如何将诸如控制向上/向下的emacs添加到vscode?
- vba - 防止访问表单被刷新
- javascript - 如何防止vue中的鼠标中键默认