Я пытаюсь определить вложенную переменную карты в заголовочном файле, который будет использоваться для поиска значения ключа (или ключа, поиска значения ключа, поскольку он вложен).
Извиняюсь за то, что очень плохо знаком с C ++ в целом, не говоря уже о C ++ 98.
У меня есть средний опыт JavaScript, который может объяснить трудности / привычки.
Я пытаюсь вставить устные языковые переводы в пользовательский интерфейс, используя вложенную карту, что-то со структурой, подобной этой:
phrases["english"]["hello"] = "hi";
phrases["spanish"]["hello"] = "hola";
, что позволит мне использовать фразы [selectedLanguage] ["hello"], которые будут возвращать (?) "Hi" или "hola" в зависимости от того, на что установлен selectedLanguage.
Это сделано для того, чтобы пользователь мог переключаться между языками, а также позволял мне просто изменить один файл translations.h, если / когда это необходимо.
У меня есть рабочая версия кода, которая помещает определения карт в код .cpp, но я хотел бы создать что-то вроде заголовочного файла, который определяет мою переменную карты «фразы», чтобы я мог отделить языковые переводы от остальная часть кода .cpp.
Мой текущий рабочий код выглядит так:
UI.cpp:
void CScnMgr::InitScreens(){
// selectedLanguage is defined
string selectedLanguage = "spanish";
//phrases map is defined
map <string, map <string, string> > phrases;
phrases["english"]["hello"] = "hi";
phrases["spanish"]["hello"] = "hola";
// then later when i need to use either translation...
phrases[selectedLanguage]["hello"];
}
Это работает, но я предполагаю, что это плохая практика, потому что он создает этот объект каждый раз, когда экраны инициализируются, и по причинам, с которыми я не знаком. Но я хочу поместить свою карту фраз в заголовочный файл.
Это дает мне ошибки:
translations.h:
#include <string>
#include <map>
int main(){
map <string, map <string, string> > newPhrases;
map <string, string> spanish;
map <string, string> english;
spanish["hello"] = "hola";
english["hello"] = "hi";
newPhrases["spanish"] = spanish;
newPhrases["english"] = english;
return 0;
}
UI.cpp:
#include "translations.h"
void CScnMgr::InitScreens(){
int extern newPhrases;
// further down where I need to display to the UI...
newPhrases[selectedLanguage]["hi"]
}
Ошибка:
UI.cpp: error: no match for 'operator[]' in 'newPhrases[selectedLanguage]'
Я, конечно, не понимаю, почему вставка «int» в «int extern newPhrases» проходит компиляцию, но именно поэтому она есть, я дал ей тип возврата main (). Мне не очень удобно это делать.
Итак, я определил selectedLanguage как «английский», поэтому я ожидал, что C ++ будет обрабатывать это как newPhrases [«english»], но кажется, что newPhrases не определен, как я ожидаю, после импорта из переводов. ч
Я был бы признателен за способ заставить этот код работать, но я также оценил бы причины, по которым это неправильный путь. Заранее спасибо!