2013-08-19 10 views
6

एसडीएल_विंडो स्ट्रक्चर में पॉइंटर बनाना और इसे साझा_पीआरआर, निर्दिष्ट त्रुटि परिणामों को असाइन करने के लिए 'sizeof' का अमान्य एप्लिकेशन। वर्ग केअधूरा प्रकार 'एसडीएल_विंडो'

भाग:

#include <SDL2/SDL.h> 

class Application { 
    static std::shared_ptr<SDL_Window> window; 
} 

परिभाषा:

#include "Application.h" 
std::shared_ptr<SDL_Window> Application::window{}; 

bool Application::init() { 
    SDL_Window *window_ = nullptr; 
    if((window_ = SDL_CreateWindow(title.c_str(), 
            SDL_WINDOWPOS_UNDEFINED, 
            SDL_WINDOWPOS_UNDEFINED, 
            window_width, 
            window_height, 
            NULL) 
     ) == nullptr) { 
     std::cerr << "creating window failed: " << SDL_GetError() << std::endl; 
    } 

    window.reset(window_); 
} 

त्रुटि में दिखाई देता है 'window.reset()'। इस व्यवहार को ठीक करने का कारण क्या है?

+1

शायद असंबंधित, लेकिन आप के बजाय SDL_DestroyWindow हटाना के माध्यम से पुनःआवंटन की जरूरत नहीं है? – PlasmaHH

उत्तर

8

डिफ़ॉल्ट रूप से, shared_ptrdelete का उपयोग कर प्रबंधित संसाधन को जारी करेगा।

window.reset(window_, SDL_DestroyWindow); 

नोट:: हालांकि, अगर आप एक संसाधन है कि एक और तरीका जारी की जरूरत उपयोग कर रहे हैं, आप एक कस्टम Deleter की आवश्यकता होगी मैं काफी यकीन है कि यह काम करेगा, लेकिन मैं एक एसडीएल की जरूरत नहीं है इसके साथ परीक्षण करने के लिए स्थापना।

+0

@vmrob: क्षमा करें, वह एक टाइपो था, मेरा मतलब था 'एसडीएल_DestroyWindow' समारोह। फ़ंक्शन पॉइंटर को कक्षा में लपेटने के बिना पर्याप्त होना चाहिए। –

7

जैसा कि पहले कहा गया था Mike, आपको shared_ptr के साथ अपना डिलीटर निर्दिष्ट करना होगा। unique_ptr के लिए, हालांकि, आप शायद अपने डिलीटर के लिए एक विशेष प्रकार बनाना चाहते हैं ताकि इसे टेम्पलेट पैरामीटर के रूप में साफ़ रूप से उपयोग किया जा सके।

struct SDLWindowDeleter { 
    inline void operator()(SDL_Window* window) { 
     SDL_DestroyWindow(window); 
    } 
}; 

फिर टेम्पलेट पैरामीटर के माध्यम से Deleter में शामिल हैं:: मैं इस struct इस्तेमाल किया

std::unique_ptr<SDL_Window, SDLWindowDeleter> sdlWindowPtr = SDL_CreateWindow(...); 
+0

इस तरह की कक्षा में फ़ंक्शन कॉल को लपेटने की कोई आवश्यकता नहीं है। डिलीटर किसी भी उचित कॉल करने योग्य ऑब्जेक्ट हो सकता है, जिसमें 'एसडीएल_DestroyWindow' के सूचक शामिल हैं। –

+0

यदि आप इसे 'std :: unique_ptr' के साथ उपयोग करते हैं, हालांकि, आपको फ़ंक्शन पॉइंटर के विपरीत एक प्रकार की आवश्यकता होगी, सही? – vmrob

+2

क्षमा करें, मैंने यह नहीं देखा कि आप 'unique_ptr' पर digressed होगा। यह फ़ंक्शन पॉइंटर सहित किसी उपयुक्त कॉल करने योग्य ऑब्जेक्ट को भी ले सकता है। यह थोड़ा गड़बड़ होगा, क्योंकि टेम्पलेट को तुरंत चालू करते समय आपको स्पष्ट रूप से डिलीटर प्रकार निर्दिष्ट करना होगा (यानी 'std :: unique_ptr '), इसलिए एक कस्टम क्लास प्रकार हो सकता है neater। –

संबंधित मुद्दे