2016-04-09 14 views
2

カスタム・ディターターを持つ一意のポインターを持つラッパー・クラスを作成しようとしています。これはクラスです:C++カスタム・ディターター・エラーの一意のポインター

class WindowObj 
{ 
    public: 
     WindowObj(); 
     WindowObj(const WindowObj&) = delete; 
     WindowObj& operator=(const WindowObj&) = delete; 
     WindowObj(WindowObj&&); 
     WindowObj& operator=(WindowObj&&); 
     WindowObj(const char* title,int x,int y,const int& w,const int& h,SDL_WindowFlags flags); 
     SDL_Window* get(); 
    protected: 
    private: 
    std::unique_ptr<SDL_Window,decltype(&SDL_DestroyWindow)> window; 
}; 
WindowObj::WindowObj(const char* title,int x,int y,const int& w,const int& h,SDL_WindowFlags flags) 
{ 
    window = make_resource(SDL_CreateWindow,SDL_DestroyWindow,title,x,y,w,h,flags); 
} 


SDL_Window* WindowObj::get(){ 
    return window.get(); 
} 

WindowObj::WindowObj(){ 
    window = NULL; 
} 

WindowObj::WindowObj(WindowObj&& other){ 
    std::swap(window,other.window); 
} 

WindowObj& WindowObj::operator=(WindowObj&& other){ 
    std::swap(window,other.window); 
} 

問題は、私はこれをコンパイルしようとすると、私はエラーerror: static assertion failed: constructed with null function pointer deleterを得るということです。代わりにshared_ptrを使用すると問題は解決しますが、ポインタを共有する必要はありません。どんな助け?

答えて

2

試してみてください。

は、あなたが実際にそれを初期化するためにメンバー初期化子リストを使用する必要があります(。make_resourceと仮定するとunique_ptrを返し、そのコンストラクタへの2番目の引数を渡す)

WindowObj::WindowObj(const char* title,int x,int y,const int& w,const int& h,SDL_WindowFlags flags) 
: window(make_resource(SDL_CreateWindow,SDL_DestroyWindow,title,x,y,w,h,flags)) 
{ 
} 

+0

make_resource関数はhttps://eb2.co/blog/2014/04/c-plus-plus-14-and-sdl2-managing-resources/からです。 – Magnus

1

あなたは決してSDL_DestroyWindowをウィンドウに渡したことはありません(その内容ではなく、unique_ptr自体に)。 あなたはそれが最初のデフォルト・構築(ヌル削除手段と、それゆえエラー)した後、あなたがそれに代入しているwindowを初期化していない

WindowObj::WindowObj(const char* title,int x,int y,const int& w,const int& h,SDL_WindowFlags flags) 
    : window(make_resource(SDL_CreateWindow,SDL_DestroyWindow,title,x,y,w,h,flags), &SDL_DestroyWindow) {} 
+0

なるほど、あなたがドン」 window()に第2引数を追加する必要があり、make_resourceがこれを処理します。以前に指摘したように、make_resource()が{}の中から呼び出された場合、まずデフォルトで構築され、次にそれが割り当てられます。 – bipll

関連する問題