查看您的代码后,我发现了问题。当您在应用程序中遇到任何中断时要查看的内容是“Autos”选项卡或“Locals”选项卡。在这里,您会注意到this 指针的一些内容:它是空的!
这意味着正在调用AddSprite 的实例不存在。这是你的SpriteManager,我看到它是一个单身人士。在您的主目录中,您不会创建它的实例。
我必须做几件事才能让它工作。我将"LudoRenderer/SpriteManager.h" 包含在Main.cpp 中,并添加了CreateInstance 调用:
SpriteManager::CreateInstance();
唯一的问题是你已经将你的构造函数/析构函数声明为私有,就像其他单例一样,但从未定义它们,所以我也这样做了:
SpriteManager::SpriteManager(){}
SpriteManager::~SpriteManager(){}
在这些更改之后,它“工作”了。那是在引号中,因为您的问题已解决,但代码m_GameManager->SetWagon(m_Wagon); 后面还有另一个错误。
这里,m_GameManager 未初始化。我在LudoEngine.cpp 的第43 行取消了m_GameManager = GameManager::GetInstance(); 的注释,这使我们遇到了与以前相同的问题,从未调用过CreateInstance。我在 main 中添加了必要的标头,称为 create 方法。这解决了问题,并且您的引擎运行(也很酷的演示!)
ErrorLogger::LogError 在退出时发生崩溃,因为ErrorLogger 为空。它在LudoMemory 的析构函数中被调用,但我会把这个留给你。 :)
现在,我认为有两个技巧会有所帮助。首先是关于我们正在解决的问题。通常,如果单身人士还没有,他们会自己创建。我会把你的单身GetInstance 改成这样:
static T *GetInstance ( )
{
if (!m_Singleton) // or == NULL or whatever you prefer
{
CreateInstance();
}
return m_Singleton; // not sure what the cast was for
}
如果还没有创建单例,这将强制创建。现在,如果您希望用户在尝试拨打GetInstance 之前先拨打CreateInstance,您可以添加某种警告:
static T *GetInstance ( )
{
if (!m_Singleton) // or == NULL or whatever you prefer
{
CreateInstance();
std::cerr << "Warning, late creation of singleton!" << std::endl;
// or perhaps:
ErrorLogger::GetInstance()->
LogError(L"Warning, late creation of singleton!");
}
return m_Singleton;
}
由于忽略了“哪个单例?”的重要信息,您可以随时尝试向其中添加 typeinfo:
#include <typeinfo>
// ...
std::cerr << "Warning, late creation of singleton: "
<< typeid(T).name() << std::endl;
尝试在其中获取一些类型名称。
最后,delete 0 没关系,不需要您检查的删除宏。
为了澄清,你有LUDO_SAFE_DELETE,它在调用删除之前检查它是否不为空。在 C++ 中,删除 null 无效,因此不需要您的检查。安全删除的所有实例都可以只替换为您的 LUDO_DELETE。