所以我一直把很多变量(即字符串,整数,字符等)放入我正在创建的所有类的头文件中。我今天注意到的是,通过这样做,当我尝试访问使用这些变量的方法时,我经常得到stackdumps。但是,如果我从头文件中删除该变量并将其直接放入我的cpp文件中,则可以使用它。我们只应该在c ++头文件中使用方法声明吗?如果不是为什么会发生这种情况(所有变量都是私有的,但是通过set和get方法进行访问)。
由于
在main.cpp中:
GameManager gamemngr;
GameManager.h
#include <string>
#include "Location.h"
#ifndef GAMEMANAGER_H_
#define GAMEMANAGER_H_
class GameManager {
public:
GameManager();
Location* curLoc;
std::string gethelpMenu();
void movePlayer(int i);
private:
Location one, two;
std::string helpMenu;
void initialiseLocations();
};
#endif /* GAMEMANAGER_H_ */
Location.h
#include <string>
#ifndef LOCATION_H_
#define LOCATION_H_
class Location {
public:
Location();
void setEdges(Location *n, Location *e, Location *s, Location *w);
Location* getEdge(int i);
void setDescription(std::string s);
std::string getDescription();
private:
Location* pathways[];
bool blocked[4];
bool locked[4];
};
#endif /* LOCATION_H_ */
如果我向位置标头添加std::string description;
,然后尝试通过curLoc->getDescription
访问它,只要它到达程序中的那一行就会堆叠转储。我假设我的指针指向无效的内存,但curLoc与对象“one”具有相同的内存地址。我是否错误地实例化了我的对象或什么?
编辑:我还要添加我在构造函数中将其设置为默认值,以确保字符串已正确初始化但不起作用。
位置实现(根据原始实现将描述放在头文件中):
#include "Location.h"
#include <string>
#include <iostream>
Location::Location() {
description = "";
for (int i = 0; i < 4; i++) {
pathways[i] = NULL;
blocked[i] = false;
locked[i] = false;
}
}
void Location::setEdges(Location *n, Location *e, Location *s, Location *w) {
pathways[0] = n;
pathways[1] = e;
pathways[2] = s;
pathways[3] = w;
}
Location* Location::getEdge(int i) {
if(pathways[i] == NULL) {
return this;
} else {
return pathways[i];
}
}
void Location::setDescription(std::string s) {
description = s;
}
std::string Location::getDescription() {
return description;
}
我应该添加这个似乎只发生在我的描述字符串而不是我已经定义的边缘方法,据我所知它们正在工作(我需要描述来仔细检查我的指针位置到确保它没有堆叠或丢失错误。)
答案 0 :(得分:1)
有编译器行为,如果编译器没有看到你的变量在.cpp文件中使用,那么它将从类中删除变量,除非有一个明确的编译标志告诉它不要。您应该始终在.cpp文件中声明您的方法。