纯C++实例化对象时构造函数日志未打印但初始化生效问题
问题根因
你看不到Dungeon构造的日志是因为日志输出后被后续的清屏操作直接清除了,实际执行顺序如下:
- 全局
Game game对象开始初始化,优先执行类内成员currentDungeon的构造逻辑:- 打印
LOG: Dungeon Constructor - 读取文件填充
rawLevelText - 调用
Debug_PrintRaw打印LOG: Dungeon PrintRaw Called.和文件内容
- 打印
currentDungeon构造完成后,进入Game类的构造函数,第一行调用ShowSplashScreen()ShowSplashScreen()第一行调用ClearScreen(),内部的system("cls")直接把之前所有输出的日志全部清空,之后才打印启动页内容,因此你完全看不到之前输出的日志。
验证方案
临时注释掉ClearScreen()函数里的system("cls");代码,重新编译运行即可看到所有预期日志。
代码优化建议
- 尽量不要用全局对象实例化复杂类,多编译单元场景下全局对象的初始化顺序存在不可预测的问题,建议把
Game game的定义放到main函数内部。 - 复杂类型的初始化建议放到构造函数的初始化列表中,逻辑更清晰,示例修改如下:
// Game.h修改 Dungeon currentDungeon; // 移除类内默认初始化 // Game.cpp构造函数修改 Game::Game() : currentDungeon("Dungeons/dungeon1.txt") { ShowSplashScreen(); currentDungeon.Debug_PrintRaw(); }
- 调试日志如果不想被清屏影响,可以考虑输出到独立日志文件,或者在清屏前调用
std::cout.flush()保证输出完成。
内容的提问来源于stack exchange,提问作者I_Keep_Trying
相关产品推荐
相关产品推荐

