* ---编辑 - 现在是整个源*
当我最后调试它时,“get”和“value”有不同的值!可能,我转换为 void* 并以错误的方式返回给用户?
#include <db_cxx.h>
#include <stdio.h>
struct User{
User(){}
int name;
int town;
User(int a){};
inline int get_index(int a){
return town;
} //for another stuff
};
int main(){
try {
DbEnv* env = new DbEnv(NULL);
env->open("./",
DB_CREATE | DB_INIT_MPOOL | DB_THREAD |
DB_INIT_LOCK | DB_INIT_TXN | DB_RECOVER | DB_INIT_LOG, 0);
Db* datab = new Db(env, 0);
datab->open(NULL, "db.dbf", NULL, DB_BTREE, DB_CREATE | DB_AUTO_COMMIT, 0);
Dbt key, value, get;
char a[10] = "bbaaccd";
User u;
u.name = 1;
u.town = 34;
key.set_data(a);
key.set_size(strlen(a) + 1 );
value.set_data((void*)&u);
value.set_size(sizeof(u));
get.set_flags(DB_DBT_MALLOC);
DbTxn* txn;
env->txn_begin(NULL, &txn, 0);
datab->put(txn, &key, &value, 0);
datab->get(txn, &key, &get, 0);
txn->commit(0);
User g;
g = *((User*)&get);
printf("%d", g.town);
getchar();
return 0;
}catch (DbException &e){
printf("%s", e.what());
getchar();
}
解决方案
创建一种“序列化器”,它将所有 POD 转换为 void*,然后将这些部分合并
PS 或者我希望将 User 重写为 POD 类型,一切都会好起来的。
添加
这很奇怪,但是......我将一个明确的非 pod 对象投射到 void* 并返回(它里面有 std::string)并且没关系(没有将它发送到数据库并返回)。怎么会这样?在我投递并发送“槽”db 后,明确地发送 pod 对象(没有额外的方法,所有成员都是 pod,它是一个简单的 struct {int a; int b; ...})我回来弄脏了一个。我的方法有什么问题?
在第一次“添加”后大约一周添加
该死的...我已经编译了它,只是为了看看它返回哪种污垢,哦!没关系!...我不能!... 啊!.. 上帝... 一个合理的问题(在 99.999% 的情况下,正确答案是“我的”,但是...这里...) - 这是谁的错?我的还是VS的?