c++从cpp文件中的头vs访问变量



所以我一直在为我正在创建的所有类的头文件中放入很多变量(即字符串、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文件中声明您的方法。

最新更新