这是我想要做的。
我有三节课:
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是您最希望日志记录类使用的内容。