【发布时间】:2021-05-02 16:18:20
【问题描述】:
我正在用 C++ 制作一些 SDL2 包装器。像这样:
/* header file */
#include <SDL_mixer.h>
#include <memory>
class SDL2_Music {
public:
~SDL2_Music() { free(); }
bool loadMusic(const std::string& path);
bool play(int loops = -1);
// more methods
private:
void free();
Mix_Music* music_ = nullptr;
};
/* cpp file */
void SDL2_Music::free() {
if (music_ != nullptr) {
Mix_FreeMusic(music_);
music_ = nullptr;
}
}
bool SDL2_Music::loadMusic(const std::string& path) {
free();
music_ = Mix_LoadMUS(path.c_str()); // this returns a Mix_Music*
if (music_ == nullptr) {
ktp::logSDLError("Mix_LoadMUS");
return false;
}
return true;
}
// more stuff
这很好,但我想摆脱原始指针,所以我也可以摆脱 free() 方法和 dtor 调用它(是的,我正在阅读关于 0 的规则) .所以我做了以下改动:
/* header file */
#include <SDL_mixer.h>
#include <memory>
class SDL2_Music {
public:
bool loadMusic(const std::string& path);
bool play(int loops = -1);
// more methods
private:
std::unique_ptr<Mix_Music> music_ = nullptr;
};
/* cpp file */
bool SDL2_Music::loadMusic(const std::string& path) {
music_ = std::make_unique<Mix_Music>(Mix_LoadMUS(path.c_str()));
if (music_ == nullptr) {
ktp::logSDLError("Mix_LoadMUS");
return false;
}
return true;
}
// more stuff
当我尝试编译 (GCC) 时,我得到:
“C:\Users\not_bjarne\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\unique_ptr.h|831|错误: 不完整类型 'struct _Mix_Music' 的使用无效"
代码块将我指向unique_ptr.h,我显然没有尝试“修复”。
【问题讨论】:
-
您应该告诉我们该文件第 831 行的详细信息。这可能会回答发生了什么的问题。
-
当然,它是
{ return unique_ptr<_Tp>(new _Tp(std::forward<_Args>(__args)...)); }。但问题似乎正是布赖恩所说的。
标签: c++ pointers sdl-2 smart-pointers