个人感觉BerkeleyDB的C++接口的设计不良之处.
时间:2010-09-06
来源:互联网
本帖最后由 wonderbeyond 于 2010-09-06 12:51 编辑
Dbt的下面这个构造函数:
Dbt(void *data, size_t size);
让我很抓狂, 严重影响处在用户空间的我的接口设计.
注意它的参数1是非const的!
我存储的内容需要使用字符串作为键(Key), 由于存到数据库中的内容要求是连续内存空间, 所以那些自行分配内存的类类型对象是不行的.
所以我要把std::string型对象的内容作为键值, 需要调用其 c_str() 成员, 但是由于 c_str()返回的是const char* 所以不能直接构造到Dbt中. 痛苦啊!!!
更严重的是, 这个事实让我被迫修改了自行设计的类的API.
我要存储的内容是一个包含了若干string的MyData对象, 还是由于需要存储连续内容的原因, 我设计了DataBlock类, 用来从MyData构造一块连续的内存, DataBlock有一个data()成员, 用来返回这块连续内存的地址, 和一个size()成员, 用来返回数据块长度. 在DataBlock中以特定的方式保存着MyData对象各个成员的内容, 并记录一些其他状态. 它buf数据成员当然应该是私有的, 外界是不知道怎么修改它也不应该修改它.所以我让size()成员返回 const char*, 用来传递给数据库进行存储.
可是可恨的Dbt的构造函数让我被迫把size()成员的返回值该成了 char* 型!
我现在感觉很烦! 真的很烦!
Dbt的下面这个构造函数:
Dbt(void *data, size_t size);
让我很抓狂, 严重影响处在用户空间的我的接口设计.
注意它的参数1是非const的!
我存储的内容需要使用字符串作为键(Key), 由于存到数据库中的内容要求是连续内存空间, 所以那些自行分配内存的类类型对象是不行的.
所以我要把std::string型对象的内容作为键值, 需要调用其 c_str() 成员, 但是由于 c_str()返回的是const char* 所以不能直接构造到Dbt中. 痛苦啊!!!
更严重的是, 这个事实让我被迫修改了自行设计的类的API.
我要存储的内容是一个包含了若干string的MyData对象, 还是由于需要存储连续内容的原因, 我设计了DataBlock类, 用来从MyData构造一块连续的内存, DataBlock有一个data()成员, 用来返回这块连续内存的地址, 和一个size()成员, 用来返回数据块长度. 在DataBlock中以特定的方式保存着MyData对象各个成员的内容, 并记录一些其他状态. 它buf数据成员当然应该是私有的, 外界是不知道怎么修改它也不应该修改它.所以我让size()成员返回 const char*, 用来传递给数据库进行存储.
可是可恨的Dbt的构造函数让我被迫把size()成员的返回值该成了 char* 型!
我现在感觉很烦! 真的很烦!
作者: wonderbeyond 发布时间: 2010-09-06
附件: Dbt 的接口一览:
class Dbt {
public:
Dbt(void *data, size_t size);
Dbt();
Dbt(const Dbt &);
Dbt &operator = (const Dbt &);
~Dbt();
void *get_data() const;
void set_data(void *);
u_int32_t get_size() const;
void set_size(u_int32_t);
u_int32_t get_ulen() const;
void set_ulen(u_int32_t);
u_int32_t get_dlen() const;
void set_dlen(u_int32_t);
u_int32_t get_doff() const;
void set_doff(u_int32_t);
u_int32_t get_flags() const;
void set_flags(u_int32_t);
DBT *Dbt::get_DBT();
const DBT *Dbt::get_const_DBT() const;
static Dbt *Dbt::get_Dbt(DBT *dbt);
static const Dbt *Dbt::get_const_Dbt(const DBT *dbt);
};
class Dbt {
public:
Dbt(void *data, size_t size);
Dbt();
Dbt(const Dbt &);
Dbt &operator = (const Dbt &);
~Dbt();
void *get_data() const;
void set_data(void *);
u_int32_t get_size() const;
void set_size(u_int32_t);
u_int32_t get_ulen() const;
void set_ulen(u_int32_t);
u_int32_t get_dlen() const;
void set_dlen(u_int32_t);
u_int32_t get_doff() const;
void set_doff(u_int32_t);
u_int32_t get_flags() const;
void set_flags(u_int32_t);
DBT *Dbt::get_DBT();
const DBT *Dbt::get_const_DBT() const;
static Dbt *Dbt::get_Dbt(DBT *dbt);
static const Dbt *Dbt::get_const_Dbt(const DBT *dbt);
};
作者: wonderbeyond 发布时间: 2010-09-06
强制转换一下就行了
作者: 皇家救星 发布时间: 2010-09-06
这么可能不能用c_str()的返回值做参数呢
作者: ydfgic 发布时间: 2010-09-06
由于存到数据库中的内容要求是连续内存空间, 所以那些自行分配内存的类类型对象是不行的
=============
这句话表达不清
=============
这句话表达不清
作者: ydfgic 发布时间: 2010-09-06
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28