我正在尝试使用C ++学习SDL。我创建了一个window.h
头文件和一个window.cpp
用于存储Window类的源文件。在window.h
它看起来是这样的:
Class Window {
public:
Window();
. . .
private:
std::unique_ptr<SDL_Window, void (*)(SDL_Window*)> window;
std::unique_ptr<SDL_Renderer, void (*)(SDL_Renderer*)> renderer;
. . .
}
并省略了该类中的某些代码。然后,在我的源文件中,在默认构造函数的定义中,执行以下操作:
Window::Window() {
window = std::unique_ptr<SDL_Window, void (*)(SDL_Window*)>(nullptr, SDL_DestroyWindow);
renderer = std::unique_ptr<SDL_Renderer, void (*)(SDL_Renderer*)>(nullptr, SDL_DestroyRenderer);
}
但是,当我进行编译时,系统unique_ptr [is] constructed with null function pointer deleter
会告诉我,据我所知这是错误的。也许我误会了如何使用unique_ptr
'的删除器,但是我无法弄清楚出了什么问题。有什么我想念的东西吗?或者我完全误解了我在做什么?
问题在于,在构造函数中,您对成员和使用分配而不是初始化。您的成员被隐式默认初始化,这会生成错误。window
renderer
但是,为什么会这样以及如何更改呢?
如果您不熟悉C ++,这听起来可能有些奇怪,但是在评估构造函数的函数体之前,将初始化任何类成员。默认情况下,每个成员都将使用其默认构造函数进行初始化,或者未进行初始化(如果是类似的原始类型int
)。如果要更改此行为(即,如果要使用其他类似的方式对其进行初始化),则必须使用成员初始值设定项列表。
例子:
Window::Window() : // <-- put a colon here
windows(nullptr, SDL_DestroyWindow), // here comes the member init list
rendered(nullptr, SDL_DestroyRenderer)
{
}
注意:从C ++ 11开始,您还可以直接在其定义处初始化成员(例如您可以在Java中进行初始化),但是在您的情况下,这会使标头看起来过于复杂。另外,这也不适合封装规则(在大多数情况下,只有类实现才知道如何处理私有成员)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句