2015-08-28 7 views
-2

EDIT: Я забыл использовать пространство имен std. Это фиксировало некоторые ошибки, но не все.Я получаю сообщение об ошибке, когда пытаюсь использовать extern, чтобы иметь переменные в нескольких исходных файлах

Я делаю текстовую игру. Первоначально игра была в одном, основном исходном файле. Теперь, для простоты навигации (игра открытая, и я пытаюсь поощрять моддинг), я хочу разбить ее на несколько файлов. Естественно, для этого мне нужны переменные, которые работают во всех файлах.

Итак, я взял все свои глобальные переменные, переместил их в файл заголовка и ударил с них extern. Да, я определил их в основном исходном файле без extern.

Вот что заголовочный файл с определениями выглядит следующим образом:

#include <string> 

extern string start; //Starts the game. 
extern int scenario; //Holds the random number that decides the scenario that plays. 
extern int roomScenario; // Holds the random number that decides what room scenario plays. 
extern int isRandom = 1; //Holds whether the map is randomized. On by default. 
extern int isSeedOn;//Holds whether the user can input a seed. 
extern int isCodes = 1; //Holds whether the codes system is on. On by default. 
extern int mapSeed; //The seed that the map creator uses. 
extern int cD; //The current intersection the player is at. 0-15. 
extern int deaths = 0; //The number of time the player has died. Zero by default. 
extern int length = 16; //Length of catacombs. 16 by default. 
extern int eLength = 15; //Effective length. Used to calculate whether the user is at the ladder. 
extern int totalLives; //Total number of lives. 
extern int lives; //Number of lives. Length/2. 
extern int livesRemain; //Number of lives remaining. It's value is equal to 'lives' - 'deaths'. 
extern int lastDiedOn; //Hold the intersection the player last died at. Will be used to leave the sketchpad to the next player. 
extern bool msgRead; //Hold whether the player has read the killer's message. Determines which ending you get. 
extern bool takenSheet; //Stuff with fore/farsight 
extern string ladderDecision; //The decision of the player when they're at the ladder. 
extern string option; //Holds what the player chooses in the options menu. 

Вот некоторые ошибки я получаю:

На всех строковых переменных, я получаю эти два ошибки:

Error C2146: syntax error : missing ';' before identifier '[VARIABLE_NAME]' 

Error C4430: missing type specifier - int assumed. 

Не работает ли extern со строковыми переменными? Если нет, то какая альтернатива?

На всех строковых переменных, которые я определяют, (не показано выше сегмента файла заголовка) Я получаю эту ошибку, а также:

error C2440: 'initializing' : cannot convert from 'const char [VARIABLE_SIZE]' to 'int' 

Опять же ехЬегп не работает со строковыми переменными?

Далее в моем заголовочном файле у меня есть три класса и некоторые массивы.

class intersect{ 
public: 
    string solve; //What the correct path is. 
    bool isCoffin; //Holds if the room is Scenario_2. 
    bool isSparkle; //Holds if the room is Scenario_1. 
}; 
class foresight{ 
public: 
    string msg; //The message of this code. 
    string msg2; //The second message. 
    int intCalled; //What intersection the code was found at. (Both of the codes would be found at the same intersection) 
    bool isCalled; //If the the code has been found. 
    bool isCalled2; //If the second code has been found. 
}; 
class farsight{ 
public: 
    string msg; 
    string msg2; 
    int intCalled; //All of these have the same purpose as the ones of the same name in foresight. Look there for the documentation. 
    bool isCalled; 
    bool isCalled2; 
}; 
extern intersect int1, int2, int3, int4, int5, int6, int7, int8, int9, int10, int11, int12, int13, int14, int15, int16, int17, int18, int19, int20, int21, int22, int23, int24, int25, int26, int27, int28, int29, int30, int31, int32; 
extern foresight fore1, fore2, fore3, fore4, fore5, fore6, fore7, fore8, fore9, fore10, fore11, fore12, fore13, fore14, fore15, fore16, fore17, fore18, fore19, fore20, fore21, fore22, fore23, fore24, fore25, fore26, fore27, fore28, fore29, fore30, fore31, fore32; 
extern farsight far1, far2, far3, far4, far5, far6, far7, far8, far9, far10, far11, far12, far13, far14, far15, far16, far17, far18, far19, far20, far21, far22, far23, far24, far25, far26, far27, far28, far29, far30, far31, far32; 
extern intersect ints[32] = { int1, int2, int3, int4, int5, int6, int7, int8, int9, int10, int11, int12, int13, int14, int15, int16, int17, int18, int19, int20, int21, int22, int23, int24, int25, int26, int27, int28, int29, int30, int31, int32 }; 
extern string msgs[32] = { msg1, msg2, msg3, msg4, msg5, msg6, msg7, msg8, msg9, msg10, msg11, msg12, msg13, msg14, msg15, msg16, msg17, msg18, msg19, msg20, msg21, msg22, msg23, msg24, msg25, msg26, msg27, msg28, msg29, msg30, msg31, msg32 }; 
extern foresight fore[32] = { fore1, fore2, fore3, fore4, fore5, fore6, fore7, fore8, fore9, fore10, fore11, fore12, fore13, fore14, fore15, fore16, fore17, fore18, fore19, fore20, fore21, fore22, fore23, fore24, fore25, fore26, fore27, fore28, fore29, fore30, fore31, fore32 }; 
extern farsight fars[32] = { far1, far2, far3, far4, far5, far6, far7, far8, far9, far10, far11, far12, far13, far14, far15, far16, far17, far18, far19, far20, far21, far22, far23, far24, far25, far26, far27, far28, far29, far30, far31, far32 }; 
extern string names[16] = { first1, first2, first3, first4, first5, first6, first7, first8, first9, first10, first11, first12, first13, first14, first15, first16 }; 

Каждая из переменных в Интс [] (с помощью пересекаются переменные, объявленные выше 32) массив, на первый план [] (с использованием 32 предвидению переменные, объявленные выше) массив, и САПС [] (Использование 32 форвардных переменных, указанных выше), генерирует ошибку. Ошибка говорит о том, что переменные в массивах повторно объявляют указанные выше переменные, просто они находятся в массиве. Смешно, но ... оригинальные объявления имеют одинаковую ошибку. Весело, правда?

И, наконец, последняя из ошибок в файле заголовка. Они появляются, когда я помещаю некоторые (но не все, по какой-то странной причине) пересекающиеся переменные в массив ints [].

На int1 и int4, я получаю ошибку:

IntelliSense: no suitable user-defined conversion from "intersect" to "std::string" exists 

На int2 и INT3, я получаю ошибку:

IntelliSense: no suitable conversion function from "intersect" to "bool" exists 

Это связано с членами данных, не так ли?

В любом случае, в исходном файле, я получаю даже еще ошибок! Ну, только одного типа.

Everytime я использую GetLine(), я получаю эту ошибку:

IntelliSense: no instance of overloaded function "getline" matches the argument list 
     argument types are: (std::istream, <error-type>) 

Я хотел бы использовать GetLine(), как это:

getline(cin, start) 

Что здесь происходит?

К счастью, это все из них, но это все еще много. (Более 400 в общей сложности!) Любая помощь будет принята с благодарностью!

+1

вам не хватает 'зЬй ::' 'Перед string' – Hcorg

+0

Я забыл об этом, и прошу прощения за ошибку такого новичка. Однако он не исправил все ошибки и даже добавил некоторые новые. Теперь все нестрочные переменные имеют множественную ошибку инициализации. – TheEliptarian

+1

Вы не можете инициализировать extern vars, например 'extern int isRandom = 1;'. Инициализируйте их там, где они действительно определены. – deviantfan

ответ

1

Вы не можете определить переменную, объявленную как extern. Extern только объявляет переменную, говоря, что она существует, а не определяет ее. Переменная должна быть определена в другом месте. неправ.

Заголовок:

extern int x; 

Где-то в другом месте (возможно, другой файл):

int x = 1; 

или

int x; 
x = SomeFunction(); 
+0

Спасибо! Это очень помогло, но теперь я получаю нерешенные внешние ошибки символов во всех моих членах массива. – TheEliptarian

+0

@ TheEliptarian вы определили их в другом месте? Неразрешенный символ - это тот, который вы где-то объявили, но не определили. – EvgeniyZh

+0

Оказалось, что я забыл переопределить мои пользовательские объекты в основном исходном файле. Все исправлено, спасибо! – TheEliptarian