我正在为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分配的内存。这很糟糕。
我想知道的是这个。有没有更好的方法来实现我正在尝试做的同时保留我的干净方法调用?目前我有通过引用操作的私有函数来解决问题,但我真的不喜欢这种方法。我很容易忘记参考文献,我最终会再次追踪同样的问题。
感谢。
答案 0 :(得分:0)
这是rvalue参考可以提供帮助的情况。它不会减少调用的构造函数/析构函数的数量,但允许在rvalue(&&)复制构造函数或operator =中“窃取”临时类实例的内部资源。详情请见http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx
这可以应用于任何实现C ++ 0x标准的C ++编译器。
答案 1 :(得分:0)
将BindValue更改为通过const引用获取参数。
void BindValue(const char* name, const SQLiteValue &value)