簡體   English   中英

c ++從標頭訪問變量與cpp文件中的變量

[英]c++ Accessing variable from header vs in cpp file

因此,我已經將許多變量(即字符串,整數,字符等)放入我正在創建的所有類的頭文件中。 我今天注意到的是,通過這樣做,在嘗試訪問使用這些變量的方法時,經常會得到堆棧轉儲。 但是,如果我從頭文件中刪除該變量並將其直接放入我的cpp文件中,則可以使用。 我們只應該在c ++頭文件中使用方法聲明嗎? 如果不是這樣,為什么會發生(所有變量都是私有的,但是可以通過set和get方法進行訪問)。

謝謝

在main.cpp中:

GameManager gamemngr;

游戲管理器

#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與對象“一個”具有相同的內存地址。 我是否錯誤地實例化了我的對象或其他東西?

編輯:我還將添加我確實將其設置為構造函數中的默認值,以確保正確初始化了字符串,但這沒有效果。

位置實現(根據我的原始實現,其說明位於頭文件中):

#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;
}

據我可能還應該補充一點,這似乎只發生在我的描述字符串中,而不是我已經定義的edge方法,據我所知它們正在運行(我需要描述來再次檢查指針位置,以確保但它不會stackdump或引發錯誤)。

存在編譯器行為,如果編譯器看不到.cpp文件中正在使用您的變量,則它將從該類中刪除變量,除非有明確的編譯標志告訴它不要使用。 您應該始終在.cpp文件中聲明您的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM