2014-03-31 90 views
1

我是C++新手,尚未完全理解RAII模式。我在寫一個使用sqlite數據庫的類,通過SQLiteC++。下面是一個使用的作品數據庫的一些示例代碼:處理RAII成員變量的正確方法是什麼?

void test() { 
    SQLite::Database db(TestDbPath(), SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE); 

    db.exec("DROP TABLE IF EXISTS test"); 
    db.exec("CREATE TABLE test (id INTEGER PRIMARY KEY, foobar TEXT)"); 
} 

我想要做的就是從一個類使用SQLite::Database。這樣的東西可以工作:

class DBUser 
{ 
private: 
    SQLite::Database *db; 

public: 
    explicit DBUser(std::string &path) { 
     db = new SQLite::Database(path, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE); 
    } 
    ~DBUser() { 
     delete db; 
    } 

    void test() { 
     db->exec("DROP TABLE IF EXISTS test"); 
     db->exec("CREATE TABLE test (id INTEGER PRIMARY KEY, foobar TEXT)"); 
    } 
} 

雖然這是最好的方法嗎?有沒有更好的方法來實現這個沒有指針?

+1

一個簡單的數據成員? –

+0

如果你有,可以使用'std :: shared_ptr',否則使用'Boost庫'中的'boost :: shared_ptr'。 – Mehrdad

+1

在這種情況下使用'std :: unique_ptr'可能是合適的。考慮到語義,我認爲你不能分享這些指針。 – MSalters

回答

5

只要有一個對象作爲成員:

class DBUser 
{ 
private: 
    SQLite::Database db; 

public: 
    explicit DBUser(std::string &path) : 
     db (path, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE) 
    { 

    } 
    void test() { 
     db.exec("DROP TABLE IF EXISTS test"); 
     db.exec("CREATE TABLE test (id INTEGER PRIMARY KEY, foobar TEXT)"); 
    } 
} 
+0

線索在標題中:RAII幾乎總是意味着使用一個對象而不是指針。 –

+0

啊,我看到了,我只是不知道如何初始化它......這相當於'){db = SQLite :: Database db(path,SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE); }'?如果是這樣,複製語義究竟是什麼? – Claudiu

相關問題