C ++ - 将类传递给其他类。我怎么知道何时使用朋友继承

时间:2013-05-18 19:20:19

标签: c++ class inheritance

我有一个游戏。游戏本身就是一个类。

我的游戏中有几行专门用于显示调试信息:

RECT rct;
rct.left = 10;
rct.right = 780;
rct.top = 10;
rct.bottom = screen.GetWindowHeight() - rct.top;

std::string debugStringResult;
std::stringstream debugString;
debugString << "Mouse X: " << mouse.GetMouseX() << ",\nMouse Y: " << mouse.GetMouseY() << ",\nLeft mouse down: " << mouse.LeftMouseDown() << ",\nRight mouse down: " << mouse.RightMouseDown() << ",\nScreen width: " << screen.GetScreenWidth() << ",\nScreen height: " << screen.GetScreenHeight() << "\nSystem resolution: " << screen.GetWindowWidth() << " x " << screen.GetWindowHeight();
debugStringResult = debugString.str(); 

font.handle->DrawText( NULL, debugStringResult.c_str(), -1, &rct, 0, font.color );

此代码目前在我的游戏绘图循环中。懒惰不是它:)

所以我现在想要声明一个变量,这样我就不会为我的rct和它的位置属性以及我正在使用的“debugStringResult”和“debugString”的字符串重新声明内存。不太懒惰:)

我决定用前面提到的变量和几种方法创建一个名为Debug的类。我意识到我必须在我的Game类中创建一个变量以允许创建实例

Debug debug;

然后我意识到我必须将我的鼠标,屏幕和gfx(用于实际绘制到屏幕部分)类引用传递给调试,以便Debug类将它们输出到屏幕。

Game::Game( HWND hWnd, const MouseServer &mouseServer, const ScreenServer &screenServer )
    :   mouse( mouseServer ),
        screen( screenServer ),
        gfx( screen, hWnd ),
        font( gfx ),
        viewport( screen, gfx ),
        debug( gfx, mouse, screen )
{

然后它击中了我。为什么我不在我的Game类中创建一个名为Debug()的函数,它保存前面带有rct和代码的代码。但后来我意识到,在我的游戏类中我现在需要声明rct,debugString和debugResult的变量......说实话,与我的游戏没什么关系,它们与调试我的游戏有关...所以我庞大的游戏变量列表变大了......

毕竟我的问题是:

如果您想要一组可以访问游戏类中使用的所有变量的Debug相关内容,那么你们会怎么做。

你认为它是游戏类的朋友吗?

您是否只是咬紧嘴唇并继续将所有类传递给调试构造函数?

您是否全局声明您的鼠标,键盘,屏幕和图形,以便您可以随处访问它们?我认为不是因为你需要观看这个项目而难以调试。

你是否创建了一种“其他”类并将所有奇怪的时髦杂项批量调入其中,如Debug

你是否创建了一个类,它作为一组对你最终通过批次的类的引用...?所以,我只是通过“参考”,而不是传递给我的视口和调试类我需要的具体事项,这是一个我将创建的类,它保存了我的游戏构造函数的引用?

我只是不知道其他人做了什么,并且变得越来越难以遵守我的做事方式?

1 个答案:

答案 0 :(得分:2)

您的绘图代码不应该知道如何构建“调试字符串”。你想要的是模型和视图的分离。

例如,有一个专用于将调试信息输出到屏幕的方法,该屏幕将成为渲染引擎的一部分。然后,该函数可能会从您的游戏引擎中调用某种GetDebugInfo(),然后从所有模块中提取所有必要信息并通过调用Debug对象来推送它,该对象将格式化字符串,随意执行任何操作信息并将适当的调试信息返回给游戏引擎。然后游戏引擎将调试字符串返回到接口,该接口只绘制它而不需要任何解释。

我还想补充一点,您推送到Debug对象的信息应该尽可能灵活,因此您可能希望使用属性的哈希映射。这可能不是最好的方法(哈希映射),但我鼓励您查看将属性映射到其值的不同方法(如果您有浮点和字符串值,您会怎么做?)。这样,Debug对象可以查看或不查看它想要处理的属性,并且它不会使函数调用中的参数更重。您只需传递一个对象(或集合,地图等),它就会被Debug对象处理。

这是一个简单的system sequence diagram可视化。

Getting debug information