2014-03-31 57 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

相关问题