首先,如果这个问题已经得到回答,请原谅,但我不能确定我的选择。
我正在开发一个 C++ 游戏引擎,我希望它符合现代标准。我以 OOP 方式编写它,并且有一个名为 ENGINE
的主类。在它里面,有几个代表特定子系统的类实例:WINDOW
、D3D11_RENDERER
等。我还有一个日志系统(LOGGER
) 必须对所有子系统可用。
现在,这种对记录器的全局访问给我带来了一个问题。我不确定是否应该在 ENGINE
类之外将其声明为静态的,并有一个函数返回对它的引用或在 ENGINE
中实例化它并使所有子系统指向它。
为了让您更好地理解我在说什么,我发布了这些场景的简化版本(考虑到我删除了很多无意义的功能)。
第一种解决方案:
class LOGGER {...};
LOGGER* GetLogger()
{
static LOGGER Logger;
return &Logger;
}
// Just one example.
class WINDOW
{
void Function()
{
GetLogger()->Write();
}
};
class ENGINE
{
private:
WINDOW Window;
}
请注意,Irrlicht 引擎是这样做的:
class Printer
{
public:
static void Write();
static LOGGER* Logger;
};
而且它可以像这样全局访问:
os::Printer::Write();
第二种方案:
class LOGGER() {...};
// Same example.
class WINDOW
{
public:
void Initialize(LOGGER* pLogger)
{
Logger = pLogger;
}
void Function()
{
Logger->Write();
}
private:
LOGGER* Logger;
};
class ENGINE
{
public:
void Initialize()
{
Window.Initialize(&Logger);
}
private:
WINDOW Window;
LOGGER Logger;
}
我不知道哪个是最好的解决方案,如果您能指出正确的解决方案,我会很高兴。提前谢谢你。
最佳答案
我认为这张图更能代表您的需求:
您的组件应该与日志无关,因为它们的功能不依赖于日志记录功能。这个功能应该委托(delegate)给引擎。
引擎本身可以包含一个 Logger
组件,它处理实际的日志记录。
让我们看一些基本代码:
class Engine {
private:
Logger& mLogger;
EngineComponent mComponents[10];
public:
Engine(Logger& logger):
mLogger(logger) {
}
void addComponent(EngineComponent& c, int pos) {
mComponents[pos] = c;
c.setEngine(this);
}
void log(const std::string& message) {
mLogger.write(message);
}
}
class EngineComponent {
private:
Engine* mEngine;
protected:
EngineComponent() {}
public:
void setEngine(Engine* engine) {
mEngine = engine;
}
void log(const std::string& message) {
if (mEngine != NULL) {
mEngine->log(message);
}
}
}
class Window : public EngineComponent {
// add implementation
}
class D3d11Renderer : public EngineComponent {
// add implementation
}
class Logger {
protected:
Logger() {}
}
class FileLogger : public Logger {
// add implementation
}
希望对您有所帮助。
关于c++ - 在现代 C++ 游戏引擎中组织全局系统访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37652259/