1

我正在为 sqlite 制作一个小包装类。为了从数据库中获取数据,我有一个名为 SQLiteValue 的类。当为查询绑定数据时,SQLiteValue 实例会在堆栈上创建并传递一些函数。类的骨架大纲如下。

class SQLiteValue : public SQLiteObject
{
private:            
    // stores a pointer to the data contained (could be of varying types)
    union 
    {
        int* i;
        double* d;
        std::string* s;
        std::wstring* ws;
        BYTE* b;
    } pdata;
            int type;



public:

    SQLiteValue(const char* val);
    SQLiteValue(const wchar_t* val);
    .. and so on for varying types
    virtual ~SQLiteValue();
};

该对象由几个重载的构造函数之一创建。构造函数根据其类型实例化 pdata 的“成员”。这对这门课来说很重要。现在,问题。我重载了构造函数,所以我得到了干净的方法调用,不需要显式调用 SQLiteValue(xxx)。因此,我真的不想对函数使用引用,所以我将它们定义为。

void BindValue(const char* name, SQLiteValue value)
query->BindValue(":username", "user2"); // the "clean" method call

像这样声明它们会导致每次实例化一个新对象(或类似的东西?)我调用一个函数,因此析构函数释放为 pdata 分配的内存。这是不好的。

我想知道的是这个。在保留干净的方法调用的同时,有没有更好的方法来实现我想要做的事情?目前我有通过引用操作的私有函数,可以解决这个问题,但我不太喜欢这种方法。我很容易忘记参考,我最终会再次追踪同样的问题。

谢谢。

4

2 回答 2

0

这是右值引用可以提供帮助的情况。它不会减少调用的构造函数/析构函数的数量,但允许在右值 (&&) 复制构造函数或 operator= 中“窃取”临时类实例的内部资源。在此处查看详细信息:http: //blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx

右值引用复制构造函数只是将另一个实例内部资源移动到“this”实例,并将另一个实例资源重置为 0。因此,它不是分配、复制和释放,而是复制一个指针或句柄。您的代码中的“user2”就是这样的临时实例 - 右值引用。

这可以应用于任何实现 C++0x 标准的 C++ 编译器。

于 2012-07-12T11:31:06.767 回答
0

更改 BindValue 以通过 const 引用获取参数。

void BindValue(const char* name, const SQLiteValue &value)
于 2012-07-12T11:51:34.203 回答