这是我想要做的。

我有三节课:

1)C引擎

2)CLogManager

3)CWindowGL

广告1。
此类“做”棘手的事情来使游戏引擎正常运行,
利用它的应用程序只能召集几个公共成员
推动游戏发展-

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)


广告2。
此类控制日志记录工具
它只允许我将一些日志转储到日志数据文件中:

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;

}


广告3。
此类处理窗口创建和像素格式设置,
以及与窗口本身相关的其他几件事-别的,
但它还需要利用CLogManager-转储一些信息
用于调试目的。

现在的问题是:

调用CLogManager构造函数时,类生成唯一的文件名,即:

m_sFileName="data/logs/enginelog_%i%i%i.txt"; // hour, minute, second


Init方法中的CEngine类执行以下操作:

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()进行分类-因为这将创建/销毁该类而不存储所需大小/已加载的纹理数组...

ff

谢谢,希望这很清楚。

最佳答案

我无法通过添加“ Instance()”类型的方法来执行此操作,因为这将导致每次调用构造函数时,CLogManager都会生成新的文件名。


实际上,在您的程序生命周期中,构造函数只会被调用一次。 singleton pattern是您最希望日志记录类使用的内容。

10-06 00:51