2013-06-23 82 views
0

我在寫一些代碼與數據庫進行交互。我的解決方案是使用各種結構的向量來表示數據庫中的每個表。我想在我的Database類中創建一個模板來push_back矢量並插入一個新的(空白)行;然而,我不知道在「push_back(...)」中放置什麼。下面這種有道理但不起作用。關鍵是正在返回,以便我可以稍後與類中的向量進行交互。通用矢量推回模板

template <class T> void Database::newRecord(T& Type, int& key) 
{ 
    Type.push_back(Type.value_type()); 
    key = Type.size()-1; 
    Type[key].PK = key; 
} 

我使用調用程序如下:

vector<table_row> table; 
int key; 
newRecord(table, key); 
table[key]... 

的結構看起來是這樣的:

struct table_row { 
    int PK; 
    .... 
}; 

謝謝!

+0

雖然這種方法看起來很誘人,我不認爲這是一個非常好的設計。一般來說,應該將I/O代碼(包括數據庫訪問)與業務模型對象(即正在構建的結構和集合)分開。通常的習慣用法是這樣的: – Stabledog

+0

1-創建實體對象(即'customer')2-創建數據庫連接包裝器(抽象數據庫連接字符串的東西3-創建一個加載器對象,它知道如何從中提取數據數據庫並填充你的實體; 4,將加載器應用於實體以填充它們;相反,加載器需要檢測沒有主鍵的新記錄並確定鍵,並將其推入然後在數據庫中插入同步它們,通常這些「ORM框架」最終會從工具中產生大量的自動生成的代碼。 – Stabledog

+0

我相信你是對的,但我沒有我真的想發送任何這些數據,我只是查詢數據,以便我可以使用它來進行資源分配計算,但是如果我想要修改數據表,我會請務必前來重新閱讀您的建議。 – Ash

回答

0

對我來說,整個想法都是魚腥味。但是,如果這是你想要的,你可以在沒有push_back的情況下做,只需要做vec.resize(vex.size()+1)比你認爲合適的修補vec.back()

我會建議忘記「空」記錄,但添加實際的預期內容。

+0

Th非常感謝。有些事情感覺就像是在作弊,但至少它是功能性的。 – Ash

0

試試這個

template <class T> void Database::newRecord(T& Type, int& key) 
{ 
    typedef Type::value_type type; 
    Type.push_back(type()); 
    key = Type.size()-1; 
    Type[key].PK = key; 
} 
+0

感謝您的回答。這會引發錯誤「類型」不會命名類型。 – Ash