2013-12-05 2 views
0

Итак, я помещал множество моих переменных (например, строк, 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 или бросает ошибки).

+1

Можете ли вы привести пример проблемы, с которой вы столкнулись? – nhgrif

+0

@nhgrif добавил дополнительную информацию, если это поможет. – Scott

+0

, если вы имеете в виду «мы должны только помещать объявления метода в .cpp-файлы», то да, вы. – Julius

ответ

1

Существует поведение компилятора, где, если компилятор не видит, что ваши переменные используются в .cpp-файле, тогда он вырезает переменные из класса, если только не существует ясного флага компиляции, чтобы сказать ему это не так. Вы всегда должны объявлять свои методы в файлах .cpp.

+0

"Вы всегда должны объявить свои методы в .cpp файлах" - - Говорит кто? – Shoe

+0

@Jefffrey ".cxx" ftw, плюсы неустойчивы! Они падают! В любом случае, вам нужен компилятор, чтобы просмотреть ваши методы. Существует одно правило объявления. –

+0

@Jefffrey http://stackoverflow.com/questions/18543980/symbol-not-found-when-using-template-defined-in-a-library/18544093#18544093, который должен объяснить, что вам нужно немного привязать. ВСЕЕ должно быть найдено только одно (если у него слабая связь) –

Смежные вопросы