2013-06-23 45 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