gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:32 26 4
gpt4 key购买 nike

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

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

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 的变量……老实说,这与我的游戏没有太大关系,它们与调试我的游戏有关……所以我庞大的游戏变量列表变得越来越大......

毕竟我的问题是:

如果你想要一组调试相关的东西,可以访问你的游戏类中曾经使用过的所有变量,你们会怎么做。

你让它成为游戏类的 friend 吗?

您是否咬紧牙关继续将所有类传递给调试构造函数?

您是否全局声明您的鼠标、键盘、屏幕和图形以便您可以在任何地方访问它们?我认为不是,因为它更难调试,因为您需要观看该项目。

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

您是否创建了一个类作为一组对您最终通过很多次的类的引用...?这样我就不会将我需要的特定内容传递到我的视口(viewport)和调试类,而是传递“引用”,这是我将创建的一个类,它包含来 self 的游戏构造函数的引用?

我只是不知道其他人在做什么,越来越难以坚持我的做事方法?

最佳答案

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

例如,有一个专门用于将调试信息输出到屏幕的方法,该屏幕将成为渲染引擎的一部分。然后该函数可能会从您的游戏引擎中调用某种类型的 GetDebugInfo(),然后它会从所有模块中提取所有必要的信息,并通过调用将格式化字符串的 Debug 对象将其推送,对信息做任何它想做的事,并将适当的调试信息返回给游戏引擎。游戏引擎然后将调试字符串返回给界面,界面只绘制它,根本没有任何解释。

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

这里是一个简单的系统时序图,为了形象化。

Getting debug information

关于C++ - 将类传递给其他类。我怎么知道什么时候使用友元继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16628095/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com