我正在尝试使用 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
and renderer
。您的成员被隐式默认初始化,这会生成错误。
但为什么会这样以及如何改变呢?
如果您是 C++ 新手,这可能听起来有点奇怪,但任何类成员都会被初始化before构造函数体被求值。默认情况下,每个成员都将使用其默认构造函数进行初始化,或者保持未初始化状态(如果它是基本类型,例如int
)。如果你想改变这种行为(即,如果你想用不同的东西初始化它,就像你想要的那样),你必须使用成员初始值设定项列表 http://en.cppreference.com/w/cpp/language/initializer_list.
Example:
Window::Window() : // <-- put a colon here
windows(nullptr, SDL_DestroyWindow), // here comes the member init list
rendered(nullptr, SDL_DestroyRenderer)
{
}
注意:从 C++11 开始,您还可以直接在成员的定义处初始化成员 http://en.cppreference.com/w/cpp/language/data_members#Member_initialization(例如,您可以在 Java 中执行此操作),但在您的情况下,这会使标头看起来太复杂。另外,这不符合封装规则(在大多数情况下,只有类实现应该知道如何处理私有成员)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)