2012-07-12 72 views
1

我正在爲sqlite做一個小包裝類。爲了從數據庫獲取數據,我有一個名爲SQLiteValue的類。當爲查詢綁定數據時,SQLiteValue實例將在堆棧上創建並傳遞給幾個函數。下面是課程的骨架輪廓。被稱爲多次的C++析構函數

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 

聲明他們這樣使被實例化每一次一個新的對象(或類似的東西?)我調用一個函數,因此析構函數釋放分配的分頁尋址。這不好。

我想知道的是這個。有沒有更好的方式來實現我想要做的事情,同時保留我的乾淨方法調用?目前我有私人功能,通過引用解決問題,但我不太喜歡這種方法。我很容易忘記參考資料,最終我會再次追查這個問題。

謝謝。

+2

嗯,這是按值傳遞所以它會創建'「用戶2」'臨時,然後將其複製到'這是在'BindValue'使用value'。然後在函數的末尾調用析構函數,然後在'query - > ...' – 2012-07-12 11:02:55

回答

0

通過const引用更改BindValue參數。

void BindValue(const char* name, const SQLiteValue &value) 
+0

Ahh ..是的,它。謝謝 – user1520427 2012-07-12 12:02:55

0

這是右值引用可以幫助的情況。它不會減少調用的構造函數/析構函數的數量,但可以「盜取」右值的臨時類實例的內部資源(& &)copy constructor或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++編譯器。

+0

感謝您的鏈接,這是一個有趣的閱讀。不幸的是,我目前沒有使用C++ 0x,但很高興知道:) – user1520427 2012-07-12 12:02:38

+0

「」這可以應用於任何實現C++ 0x標準的C++編譯器。「」 – 2012-07-12 13:14:01