Итак, я помещал множество моих переменных (например, строк, ints, chars и т. Д.) В мои файлы заголовков для всех моих классов, которые я создаю. То, что я заметил сегодня, заключается в том, что, делая это, я часто получаю stackdumps при попытке доступа к методам, использующим эти переменные. Однако, если я удалю переменную из файла заголовка и поместил ее прямо в файл cpp, он будет работать. Должны ли мы использовать декларацию метода внутри файлов заголовков C++? Если нет, то почему это произойдет (все переменные являются частными, но к ним обращаются через методы set и get).C++ Доступ к переменной из заголовка vs в файл cpp
Благодаря
В 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 имеет тот же адрес памяти, что и объект «один». Я неправильно создаю объекты или что-то еще?
EDIT: Я также добавлю, что я установил его в значение по умолчанию в конструкторе, чтобы убедиться, что строка правильно инициализирована, но это не имеет никакого эффекта.
Место реализации (с описанием помещенной внутри файла заголовка в соответствии с моей первоначальной реализации):
#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;
}
я, вероятно, следует добавить это только кажется, происходит с моей строки описания, а не методами ребер у меня есть а также, насколько я могу судить, они работают (мне нужно, чтобы описания дважды проверяли местоположение моих указателей, но это не делает stackdump или бросает ошибки).
Можете ли вы привести пример проблемы, с которой вы столкнулись? – nhgrif
@nhgrif добавил дополнительную информацию, если это поможет. – Scott
, если вы имеете в виду «мы должны только помещать объявления метода в .cpp-файлы», то да, вы. – Julius