Цитата
Как это сделать без глобальных объектов?
Легко. Через интерфейсы. А выбор интерфейса где-то предусмотреть.
А экземпляр обьекта TCP создавать непосредственно перед использованием, к стати и тут может происходить выбор интерфейса.
Код выглядит всегда одинаково и никакой связи между файлами драйвера и файлами протокола нету.
Код
class IPaintEngine{
public:
virtual int w()=0;
virtual int h()=0;
virtual void drawText(const Point &pos,const char *text,const Palette &pal)=0;
virtual void drawRect(const Rect &rect,const Palette &pal)=0;
};
Сама рисовалка. Пусть это будет наш протокол. Экземпляр создается тогда,когда он нам нужен:
Код
class Painter{
public:
Painter(PaintDevice *dev);
void drawText(const Point &pos,const char *text,const Palette &pal);
void drawRect(const Rect &rect,const Palette &pal);
void fillBackground(const Palette &pal);
...
private:
PaintDevice *paintdev;
...
};
От этого наследуемся, если хотим уметь рисовать:
Код
class PaintDevice{
public:
virtual IPaintEngine* paintEngine()=0;
...
};
И организовываем выбор драйвера через virtual IPaintEngine* paintEngine();
Рисуем
Код
class Widget : public PaintDevice{
public:
...
virtual void draw(){
Painter painter(this);
painter.drawText(Point(0,0),"Hello word");
}
...
};
Наверное заметили некое сходство с Qt...

Да, некоторые идеи я передрал с докуминтации Qt

Цитата
В принципе, лочить можно внутри каждого метода отрисовки. Я так однажды делал.
Мьютекс лежит среди полей класса драйвера, инитится в initialize() методе драйвера.
Нет, вы немного не поняли. Кто лочить будет static Driver instance; ?
Ведь вызватся функция static Driver& Instanse() может одновременно, когда обьект instance еще не создан.
Один тред вызвал Instanse(), та запустила конструктор для instance (тк instance еще не создан) и тут процесс посреди конструктора прервался и кто-то другой опять вызвал Instanse() и ...и сами понимаете что

Ведь процесс создания instance мы никак не контроллируем...
Я синглтоны делаю так:
Код
class BragUI{
public:
BragUI();
static BragUI& getInst()const{ return ui; }
private:
static BragUI ui;
};
....
BragUI::ui=BragUI();
Цитата
Прощу прощения за мое невежество, а что это такое?
Это такая хреновина... Регламентировано ARM IHI0041C CPPABI:
Цитата
Each element of the vector contains the address of a function of type extern “C” void (* const)(void) that, when
called, performs part or all of the global object construction for the translation unit.
Нам остается их вызвать где-то при старте for(i=0;i<sizeofinitarray;i++)__init_array[i]();
Цитата
Вот именно и выходит муть - ее не разобрать без "словаря" уже через месяц отдыха ))
Куча параметров в одной строчке. Куча static объектов.
А так как их конструторы с параметрами, то их уже не засунуть никуда, кроме как в начало С++ файла (это я про читаемость кода).
С развитием проекта наступит точка хаоса... ))
Это процесс создания окошек. А реализация уже в других файлах. в будущем вообще этот код будет софтиной-дизайнером генерится( типа как в Qt

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

Ну всякие там MessageBox-ы и диалоги ессно создаются в стеке когда это нужно, эти массивы надо только для построения основного ui.
Цитата
А как вы ссылаетесь на них из других объектов, объявленных в других файлах?
Зачем на них ссылаться? Досточно выполнить execMenu(); где нам нужно
Код
static Menu mainMenu(Rect(0,8,96,56),0,mainItemsList,sizeof(mainItemsList)/sizeof(MenuItem*));
void execMenu(){
mainMenu.exec();
}
Цитата
Ну вот так и рождаются "костыли". Неправильно это как-то. Пока код маленький - все гуд, но потом приходит жопа.
Ну, должно ж быть "резиновое" решение, которое будет работать на коде любой сложности и объема.
Поможет разве что раздельная линковка ОС и программы с тредами. Сначала стартует ОС, подготавливает почву для создания всяких мютексов, а потом стартует прога и уже спокойно можно реализовывать такие синглтоны:
Код
class Single{
public:
Single(){ initialized=0; }
static Single& getInst(){
inst.m.lock();
if(!inst.initialized)inst.init();
inst.m.unlock();
return inst;
}
private:
static Single inst;
Mutex m;
bool initialized;
void init();
};
Single Single::inst=Single();
Цитата
Согласен, одно и то же, но классическая хуча в эмбэддед софтах - величайшее зло
Ну да, потому я за init()

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