处理RAII成员变量的正确方法是什么?

时间:2014-03-31 23:32:08

标签: c++ class pointers constructor raii

我是C ++的新手,还没有完全理解RAII模式。我正在写一个通过SQLiteC++使用sqlite数据库的类。以下是一些使用有效数据库的示例代码:

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 :(得分: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)");
    }
}