(Программа - на языке С++, не смотря на то что сорцы предоставленные здесь - на гарпе, т.к. варианта обернуть его в с++ я не нашел из предоставленных).
А именно…
1. Файл KeyBoard.cpp. Он инклюдится в винМэйн методе первым. Все что инклюдится дальше - то все через него(в винмэйне из этой все игрархии больше ничего нет). В этом файле все что нас интересует - это включенный Controller.cpp…
#include "stdafx.h"
#include "Controller.cpp"
class KeyBoard{
public:
KeyBoard(){
};
private:
Controller controller;
void allocateButtons(){
std::vector<KeyBoardChar> nums = this->controller.getNums();
};
LangLayout getDefaultLangLayout() {
return this->controller.getDefaultLangLayout();
}
};
2. Идем дальше… Файл Controller.cpp. Обращаем внимание на включенные Model.cpр и LangLayout.cpp, т.к. они играют тут ключевую роль.
Так же в этом классе упоминается класс KeyBoardChar(в нем то вся какраз и соль) который включен Model.cpp. Но на этом этапе пока все тоже ок…
#include "stdafx.h"
#include "Model.cpp"
#include "LangLayout.cpp"
class Controller{
public:
Controller(){
};
std::vector<KeyBoardChar> getNums()
{
Model *m = new Model();
return m->NUMS_LAYOUT;
};
LangLayout getDefaultLangLayout() {
return defaultLangLayout;
};
private:
LangLayout defaultLangLayout,
secondaryLayout,
specialCharsLayout;
Model model;
void allocateButtons(){
OutputDebugString(L"allocateButtons()…");
};
};
3. класс Model.cpp. Тут особо ничего нет, опять как и всюду, ключевой момент - последовательные инклюды.. и вот он, включенный KeyBoardChar.cpp…
Все, по сути я так понимаю дальше все включаемые файлы должны его видеть…
#include "stdafx.h"
#include <vector>
#include "KeyBoardChar.cpp"
class Model{
public:
std::vector<KeyBoardChar> NUMS_LAYOUT;// (12);
};
4. Вернемся к файлу Controller.cpp, так как он кроме Model.cpp содержит включение еще и LangLayout.cpp, который подключается позже.
#include "stdafx.h"
#include <vector>
class LangLayout{
public:
LangLayout() {
};
LangLayout(unsigned int aid) {
this->setID(aid);
//this.layout = new Vector();
};
unsigned int getID() {
return this->id;
};
void setID(unsigned int aid) {
this->id = aid;
};
private:
KeyBoardChar b;
unsigned int id;
};
И вот в этом файле зарыта проблема так как компилятор на нем крешает. Если ему явно не объявить включение KeyBoardChar.срр(а нам и ненужно, ибо как было сказано - он включается раньше - в Model.cpp), то компилятор выдает:
C:\test1\LangLayout.cpp(58) : error C2146: syntax error : missing ';' before identifier 'b'
C:\test1\LangLayout.cpp(58) : error C2501: 'KeyBoardChar' : missing storage-class or type specifiers
C:\test1\LangLayout.cpp(58) : error C2501: 'b' : missing storage-class or type specifiers
(Там правда строчка не 58 потомучто я тут много убрал из файла закомменченого, но суть одна и та же - крешает в конце где обьявлено поле приватным " KeyBoardChar b;")
А вот если я обьявлю инклюд фала KeyBoardChar.срр - то как и предполагалось, выдаст " 'KeyBoardChar' : 'class' type redefinition "…
В чем же проблема? Возможно нужно какието нэймспейсы поопределять чтоли. Я хэдеров кстати не юзаю(предполагаю определять методы/поля в классах сразу).
С++ стал учить недавно(пишу порт из другого языка), потому желательно жестко не критиковать… На то что написано в классах кроме иклюдов фактически можете не обращать внимания, так как это лишь попытки скомпилить иерархию включений на начальном этапе..
Суть вся в том что, какие свои классы в LangLayout.cpp я бы не вставлял(не важно, KeyBoardChar, Model, Controller) - он на них всегда матерится… а вот на свои встроенные - все пойдет на ура…