std::unique\u ptr没有合适的默认构造函数

这是我上一篇文章的延续。因为它已经关闭了,我决定做一个新的职位。我删除了一半代码以使其更具可读性

我读到的一些帖子:

带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_窗口)&gt不是默认可构造的。这意味着

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渲染器未就绪!”;;
}
}

发表评论