所以我一直在为我正在创建的所有类的头文件中放入很多变量(即字符串、int、字符等)。我今天注意到的是,通过这样做,当我尝试和访问使用这些变量的方法时,我经常会得到stackdump。但是,如果我从头文件中删除变量,并将其直接放入我的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_ */
位置.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;
}
我可能还应该补充一点,这似乎只发生在我的描述字符串中,而不是我定义的edges方法中,据我所知,它们正在工作(我需要描述来仔细检查我的指针位置,以确保它不会堆积或抛出错误)。
有一种编译器行为,如果编译器没有在.cpp文件中看到您的变量被使用,那么它将从类中剪切变量,除非有一个明确的编译标志告诉它不要这样做。您应该始终在.cpp文件中声明您的方法。