2010-03-12 7 views
8

के साथ इसका उपयोग नहीं कर सकता मैं लूआ के लिए एक सी ++/ओओपी रैपर लिख रहा हूं। मेरा कोड है:shared_ptr को पूर्ण प्रकार की आवश्यकता है; lua_State *

class LuaState 
{ 
    boost::shared_ptr<lua_State> L; 

    LuaState(): L(luaL_newstate(), LuaState::CustomDeleter) 
    { 
    } 
} 

समस्या lua_State अपूर्ण प्रकार है और shared_ptr कन्स्ट्रक्टर को पूर्ण प्रकार की आवश्यकता है। और मुझे सुरक्षित सूचक साझा करने की ज़रूरत है। (मजेदार चीज बूस्ट डॉक्स का कहना है कि अधिकांश कार्यों को पूर्ण प्रकार की आवश्यकता नहीं होती है, लेकिन कन्स्ट्रक्टर की आवश्यकता होती है, इसलिए इसका उपयोग करने का कोई तरीका नहीं है। http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/smart_ptr.htm)

क्या मैं इसे हल कर सकता हूं? धन्यवाद।

+0

यदि मैं पूछूं तो आपको सुरक्षित सूचक साझाकरण की आवश्यकता क्यों है। क्या आप विनाशक में कन्स्ट्रक्टर और lua_close में luaL_newstate को कॉल नहीं कर सकते हैं। –

+0

लुआस्टेट ए, बी; ए = बी; // बी में lua_State कभी जारी नहीं किया जाएगा // lua_State एक बार में दो बार जारी किया जाएगा दूसरा विकल्प कॉपी कन्स्ट्रक्टर और ऑपरेटर = में lua_State संरचना को क्लोन कर रहा है। लेकिन मुझे लगता है कि यह भारी समाधान है। –

+0

आप मैन्युअल रूप से lua_State संरचना को क्लोन नहीं कर सकते हैं। यह आपके चेहरे में उड़ाएगा। मैंने कोशिश की है :) –

उत्तर

4

आप अपने स्वयं के विघटन का उपयोग कर रहे हैं, जिसका अर्थ है कि आपके पास निर्माण पर पूरा प्रकार नहीं है। एकमात्र आवश्यकता यह है कि CustomDeleter इसे संभाल सकता है। (यह void* से CompleteType* करने के लिए, सूचक, एक पूरा प्रकार के लिए पारित (उदाहरण के लिए कहते हैं परिवर्तित कर सकते हैं)।

पूर्णता की पृष्ठभूमि है कि एक बार shared_ptr के निर्माता डिफ़ॉल्ट Deleter साथ कहा जाता है, यह एक वर्ग का दृष्टांत जाएगा यदि आप गुजरती हैं और के लिए इस कोड सही, p अधूरा नहीं होना चाहिए तो यह प्रकार की पूर्णता पर निर्भर नहीं करता नाशक परोक्ष रूप से इस Deleter कोड फोन करेगा,

हालांकि - कि लाइन delete p; शामिल हैं।। अपना खुद का हटाना, आपके स्वयं के विघटन की आवश्यकताएं लागू होंगी। को lua_State के बाद पूरा करना सुनिश्चित हो गया है।

+0

प्रतिक्रिया के लिए धन्यवाद। आपका कोड वही है जो मैंने लिखा था। यह स्थिर चेक पर "shared_ptr :: check_delete" में विफल रहता है "typedef char type_must_be_complete [sizeof (T)? 1: -1];" –

+0

@topright, अगर आप अपने स्वयं के डिलीटर का उपयोग करते हैं जो सही है, तो ऐसा विफल नहीं होना चाहिए। अपने 'कस्टमडिलेटर' को इस तरह से परिभाषित करना सुनिश्चित करें कि उसका शरीर 'lua_State' की परिभाषा के बाद होता है। –

+0

ओह, यह अब काम करता है। धन्यवाद! –

1

यह अजीब लग रहा था कि boost::shared_ptr को तत्कालता के लिए एक पूर्ण प्रकार की आवश्यकता होगी, इसलिए मैंने इस छोटे से छोटे परीक्षण को लिखा जो विपरीत (कोड अंत में) प्रदर्शित करता है।

मेरा मानना ​​है कि समस्या पूर्ण होने की आवश्यकता के साथ नहीं है, लेकिन दूसरे तर्क के साथ कि आप shared_ptr कन्स्ट्रक्टर में जा रहे हैं, जो सदस्य कार्य की तरह दिखता है। दूसरा तर्क एक पॉइंटर तर्क के साथ कुछ कॉल करने योग्य होना चाहिए। यदि आप अपने रैपर के सदस्य फ़ंक्शन का उपयोग करना चाहते हैं तो आप इंटरफ़ेस को अनुकूलित करने के लिए boost::bind का उपयोग कर सकते हैं।

शायद तुम ?:

LuaState(): L(luaL_newstate(), boost::bind(LuaState::CustomDeleter,this,_1)) 
{ 
} 

प्रदर्शन का मतलब है कि boost::shared_ptr पूरा प्रकार की आवश्यकता नहीं है:

// forward declarations 
struct test; 
test * create(); 
void destroy(test *); 

// wrapper equivalent to the one in the question 
struct wrapper { 
    boost::shared_ptr<test> sp; 
    wrapper() : sp(create(), destroy) {} 
}; 

// actual definitions 
struct test {}; 
test * create() { return new test; } 
void destroy(test *t) { delete t; } 

// make it executable 
int main() { 
    test t; 
} 
0

यह देखते हुए कि एक lua_State * क्लोन नहीं किया जा सकता, एक LuaState वस्तु सार्थक को कॉपी कर रहा है? ऐसी अंतर्निहित अनौपचारिक वस्तु की प्रतिलिपि बनाने की अपेक्षित अर्थशास्त्र क्या हैं? और सबसे अच्छा तरीका यह है कि LuaState uncopyable हो सकता है और lua_State के जीवनकाल का प्रबंधन करने के लिए तो आप एक shared_ptr<LuaState> के रूप में राज्य के आसपास पारित कर सकते हैं करने के लिए -

व्यवहार आप चाहते करने लगते हैं उथले नकल है।

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