Вот что я пытаюсь сделать.
У меня есть три класса:
1) Двигатель
2) CLogManager
3) CWindowGL
Ad1.
Этот класс "делает" сложные вещи, чтобы запустить игровой движок,
приложение, использующее его, может вызывать только несколько открытых
начать игру -
class CEngine
{
public:
CEngine();
~CEngine(); // should this go to private?
bool Init(width,height,...);
void Destroy();
void Run();
bool LoadMap(...);
private:
CLogManager *m_pLogManager;
CWindowGL *m_pWindowManager
}
// Example usage
CEngine *Engine=new CEngine;
Engine->Initialize(...)
Engine->LoadMap(...)
Engine->Run()
Engine->Destroy()
delete(Engine)
Ad2.
Этот класс управляет средством регистрации
это просто позволяет мне записать некоторые данные в файл данных журнала:
class CLogManager
{
public:
CLogManager();
~CLogManager();
void Write(const char *fmt,...);
private:
FILE *fp;
std::string m_sFileName; // unique filename generated at the constructor
SYSTEMTIME m_tSystemTime;
}
Ad3.
Этот класс обрабатывает создание окна и настройки формата пикселей,
и несколько других вещей, связанных с самим окном - ничего больше,
но он также должен использовать CLogManager - чтобы сбросить немного информации
в целях отладки.
Теперь вопрос:
Когда вызывается конструктор CLogManager, класс генерирует уникальное имя файла:
m_sFileName="data/logs/enginelog_%i%i%i.txt"; // hour, minute, second
Класс CEngine в методе Init делает:
m_pLogManager = new CLogManager;
и позже он использует его с m_pLogManager-> Write (....) для регистрации событий.
Это нормально для CEngine, но я хотел бы использовать ту же функциональность
в классе CWindowGL и вот вопрос.
Я бы хотел, чтобы мой код делился с CLogManager:
CEngine
CWindowGL
...
...
...
и несколько других, которые я буду реализовывать.
Я не могу сделать это, добавив метод "Instance ()", например:
static CLogManager &Instance()
{
static CLogManager s_instance;
return s_instance;
}
и звонят:
CLogManager::Instance().Write(" LOG MESSAGE ");
Так как мой CLogManager будет генерировать новое имя файла каждый раз, когда
конструктор называется.
Должен ли я
extern CEngine *Engine;
куда звонить
Engine->Log(" LOG MESSAGE ")
Обертка каждый раз или есть что-то еще, к чему я могу придерживаться?
Я знаю, что это больше похоже на вопрос о дизайне кода, но я бы хотел увидеть
как вы, ребята, справляетесь с такими вещами.
Обычно я делаю это с extern, но для этого нужно проверить
m_pLogManager! = NULL в функции-обёртке для закрытого члена - и просто
не знаю, нормально ли это
Может быть, есть какой-то другой - лучший подход?
Я буду добавлять несколько других классов, как. TexturesManager - и хотел бы, чтобы этот класс
сохранить фактический размер загруженных текстур и т. д., так что это также потребует от меня
не вызывать Instance () для класса каждый раз, когда вызывается текстура - так как это создаст / уничтожит класс без сохранения необходимого размера / массива уже загруженных текстур ...
Уфф ..
Спасибо, надеюсь, это понятно.