C ++ / W32 Sharing Class - вопрос разработки кода - PullRequest
0 голосов
/ 21 августа 2011

Вот что я пытаюсь сделать.

У меня есть три класса:

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 () для класса каждый раз, когда вызывается текстура - так как это создаст / уничтожит класс без сохранения необходимого размера / массива уже загруженных текстур ...

Уфф ..

Спасибо, надеюсь, это понятно.

Ответы [ 2 ]

3 голосов
/ 21 августа 2011

Я не могу сделать это, добавив метод «Instance ()», так как это приведет к тому, что мой CLogManager будет генерировать новое имя файла каждый раз, когда вызывается конструктор.

На самом деле нет, конструктор будет вызываться только один раз за время жизни вашей программы. одноэлементный шаблон - это то, что вы, скорее всего, захотите для своего класса регистрации.

0 голосов
/ 21 августа 2011

В этих ситуациях вы обычно найдете статический набор методов, которые используют синглтон внизу. Все потребители вызывают статический метод, который возвращает единственный экземпляр вашего регистратора, который затем вызывается методами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...