c++ - RAII and assignment -


मैंने एक sqlite3 कनेक्शन के लिए निम्न वर्ग बनाया है:

  class SqliteConnection {सार्वजनिक: sqlite3 * मूल; SqliteConnection (std :: स्ट्रिंग पथ) {sqlite3_open_v2 (path.c_str (), और मूल, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); } ~ SqliteConnection () {sqlite3_close (मूल); }}  

और उसके बाद कोई भी कनेक्शन को प्रारंभ कर सकता है

  SqliteConnection conn ("./ database.db");  

हालांकि, मैं इस कनेक्शन को साझा करने में सक्षम होना चाहता हूं, इसे कक्षाओं में एक सदस्य के रूप में संग्रहीत करना है, और मुसीबत डिफ़ॉल्ट असाइनमेंट ऑपरेटर operator = < / code>। कुछ करना

  SqliteConnection conn ("./ database.db"); SqliteConnection conn1 = conn;  

डेटाबेस पॉइंटर पर दो sqlite3_close कॉल की ओर जाता है क्योंकि प्रत्येक चर का दायरा खत्म हो जाता है। जब आप अपने संसाधन को किसी भिन्न चर में निर्दिष्ट करना चाहते हैं, तो आप RAII के साथ इस कठिनाई को कैसे दूर करते हैं?

साझा संसाधनों को आप को उनके लिए मौसम के संदर्भों का ट्रैक रखना होगा, उदाहरण के लिए का उपयोग करना एक कार्यान्वयन कस्टम डिलीवर के साथ है:

  वर्ग SqliteConnection {boost :: shared_ptr & lt; sqlite3 & gt; देशी; सार्वजनिक: SqliteConnection (const std :: स्ट्रिंग और पथ): देशी (init_connection (पथ), और नष्ट_कनेक्शन) {} // ...}; Sqlite3 * init_connection (const std :: स्ट्रिंग और पथ) {// ... return ptr; } शून्य नष्ट_कनेक्शन (sqlite3 * p) {sqlite3_close (p); }  

Comments