这是我上一篇文章的延续。因为它已经关闭了,我决定做一个新的职位。我删除了一半代码以使其更具可读性
我读到的一些帖子:
带SDL的智能指针
可以将SDL2与智能指针一起使用吗
关于SDL_窗口和unique_ptr的几个问题
类cGraphics
{
公众:
//创建者功能
std::unique_ptr<;SDL_Window、decltype(&;SDL_destroy Window)>;Create_Window(intxwin、intywin);
//ctor和dtor
cGraphics():m_窗口(nullptr,SDL_窗口){}
cGraphics(int xWin、int yWin);
~cGraphics();
私人:
std::unique_ptr<;SDL_窗口、decltype(&;SDL_destroy窗口)>;m_窗口;
};
cGraphics::cGraphics(intxwin,intywin)
{
m_Window=std::move(创建_Window(xWin,yWin));
if(m_Window==nullptr)
{
抛出“SDL_窗口或SDL_渲染器未就绪!”;
}
}
cGraphics::~cGraphics()
{
IMG_Quit();
SDL_退出();
}
标准::唯一性\u ptr<;SDL_窗口、decltype(&;SDL_窗口)>;cGraphics::创建_窗口(intxwin、intywin)
{
return std::unique\ptr<;SDL\u Window,decltype(&;SDL\u DestroyWindow)>;(SDL\u CreateWindow(“SDL Window”,SDL\u WINDOWPOS\u未定义,SDL\u WINDOWPOS\u未定义,xWin,yWin,显示SDL\u Window),SDL\u DestroyWindow);
}
编译器抱怨:
'std::unique\u ptr<;SDL_窗口,无效(u cdecl*)(SDL_窗口*)>;:唯一的\u ptr”:没有合适的默认构造函数可用
我知道,当编译器找不到某些成员的默认构造函数时,通常会出现此错误。但是这不是真的,因为我明确声明了std::unique\u ptr的默认值
如果编译器实际上在抱怨SDL_Window,这是一个不完整的类型(C结构),我该怎么办
Astd::unique\u ptr<;SDL_窗口、decltype(&;SDL_窗口)>不是默认可构造的。这意味着
cGraphics::cGraphics(intxwin,intywin)***
{
m_Window=std::move(创建_Window(xWin,yWin));
if(m_Window==nullptr)
{
抛出“SDL U窗口或SDL U渲染器未就绪!”;;
}
}
当您到达部分***时,编译器将尝试默认构造m_窗口,因为您在成员初始化列表中没有这样做。从编译器到默认构造m_窗口的尝试是导致错误的原因。我们可以通过移动m_Window=std::move(Create_Window(xWin,yWin))来解决这个问题从构造函数体中取出,并将其放入成员初始化列表中,如下所示
cGraphics::cGraphics(intxwin,intywin):m_窗口(Create_窗口(xWin,yWin))
{
if(m_Window==nullptr)
{
抛出“SDL U窗口或SDL U渲染器未就绪!”;;
}
}
如果您不想这样做,那么可以委托给默认构造函数,然后像最初那样分配给m_Window。那看起来像
cGraphics::cGraphics(intxwin,intywin):cGraphics()
{
m_Window=创建_Window(xWin,yWin);
if(m_Window==nullptr)
{
抛出“SDL U窗口或SDL U渲染器未就绪!”;;
}
}