我一直在编程的冒险游戏,并拥有一切整个二维数组地牢工作,直到运动。地图是他们自己的结构,而角色是一个类。 Character类的成员变量之一是Map,curMap
,它表示玩家当前所在的地图。但是,在Main.cpp中进行测试时,作品和地图没有正确更新。这是代码,之后我会解释我已经完成了什么。C++ - 类不更新成员正确
Maps.h
#include <string>
#include <vector>
using namespace std;
struct Map {
vector<string> layout;
vector<int> exits; //indices in allMaps array
string name;
int level;
Map();
Map(vector<string> l, vector<int> e, string n, int lvl);
};
extern Map noMap;
extern Map highashPlainsA, highashPlainsB, highashPlainsC; //Highash Plains
extern Map alnwick, alnwickForge, alnwickMarket, alnwickInn; //Alnwick
extern vector<Map> allMaps;
extern vector<string> blankLayout;
extern vector<string> plainsLayoutA, plainsLayoutB, plainsLayoutC; //Highash Plains
extern vector<string> alnwickLayout; //Major Towns
extern vector<string> forgeLayout, marketLayout, innLayout; //Town Buildings
Maps.cpp
#include "Maps.h"
Map::Map() :
layout(blankLayout),
exits({0, 0, 0, 0}),
name("_NO_MAP_"),
level(0){}
Map::Map(vector<string> l, vector<int> e, string n, int lvl) :
layout(l),
exits(e),
name(n),
level(lvl){}
Map noMap = Map();
Map highashPlainsA = Map(plainsLayoutA, {4, 3, 2}, "Highash Plains A", 1);
vector<Map> allMaps = {noMap, highashPlainsA};
vector<string> blankLayout =
{"##############################",
"# #",
"# #",
"# #",
"# #",
"# #",
"# #",
"# #",
"# #",
"##############################"};
vector<string> plainsLayoutA =
{"##########################33##",
"# G ##### ####### E #### 2",
"# # # D # # G # 2",
"# # # ## ####################",
"# # ##E# # G G#",
"#E# G# G G#",
"# # ##########E############",
"# #### #DE G ED#",
"# ###D #DE G ED#",
"################111###########"};
Character.h(我切出了很多不重要的代码在这里)
#include "Maps.h"
#include <iostream>
class Character {
Map curMap;
public:
Character();
~Character();
void SetMap(Map map);
Map GetMap();
};
extern Character player;
Character.cpp(左明表示不重要的代码在这里也一样)
#include "Character.h"
Character::Character() : curMap(highashPlainsA){}
Character::~Character(){}
void Character::SetMap(Map map){
cout << "OLD MAP NAME: " << curMap.name << "\n";
curMap = map;
curMap.layout = map.layout;
curMap.exits = map.exits;
curMap.name = map.name;
curMap.level = map.level;
cout << "NEW MAP NAME: " << curMap.name << "\n";
}
Map Character::GetMap(){
return curMap;
}
Character player = Character();
Main.cpp的
#include "Character.h"
int main(){
player.SetMap(highashPlainsA);
cout << "\nSIZE OF CURRENT LAYOUT: " << player.GetMap().layout.size() << "\n";
cout << "SIZE OF PLAINS A: " << plainsLayoutA.size() << "\n";
cout << "Name of map: " << player.GetMap().name << "\n";
// cout << "Layout of map: \n" << player.GetMap().layout[0] << "\n" << player.GetMap().layout[1] << "\n" << player.GetMap().layout[2] << "\n"<< player.GetMap().layout[3] << "\n"; // Crashes because for whatever reason the layout size is 0
return 0;
}
什么已经过测试: 在Character::SetMap()
我甚至尝试改变各个体变量,但不应该将Map设置为整体来更改所有这些值?此外,在Map::Map(vector<string> l, vector<int> e, string n, int lvl)
,我试过它没有初始化列表,但它仍然无法正常工作。我并没有真正期待它,但我猜这值得一试。
的问题:
控制台输出:
OLD MAP NAME: Highash Plains A
NEW MAP NAME: Highash Plains A
SIZE OF CURRENT LAYOUT: 0
SIZE OF PLAINS A: 10
Name of map: Highash Plains A
的字符类确实初始化curMap
成员,并调用默认的构造函数这样做。这是预期的功能,因为在安装过程中播放器所处的地图无关紧要。然而,在尝试设置映射到另一个预先创建地图实例(使用SetMap()
,一切都从那里顺心。按照控制台记录,的curMap
名称设置为正确的名称(OLD地图名称),并保持这一套时。新的地图可是,布局而日志的目标载体的直接尺寸给出了正确的值返回一个空向量到底是怎么回事,我怎么能解决这个问题
欢迎计算器.COM。请花些时间阅读[帮助页面](http://stackoverflow.com/help),尤其是名为[“我可以问些什么话题?”](http://stackoverflow.com/help/讨论话题)和[“我应该避免问什么类型的问题?”](http://stackoverflow.com/help/dont-ask)。也请[tour](http:// stackoverflow。com/tour)并阅读[如何提出好问题](http://stackoverflow.com/help/how-to-ask)。最后,请学习如何创建[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。 – Weaboo
虽然您提供了很多信息,但您并未给出一个最小完整的可验证示例。此代码不能编译,所以我们不能简单地重现您的问题。 – JHBonarius
目前还不清楚你的实际问题是什么,因为有很多不重要的信息,没有足够的重要信息。哪种方法不符合您的预期? 'SetMap'? – jwimberley