+ -
当前位置:首页 → 问答吧 → 个人感觉BerkeleyDB的C++接口的设计不良之处.

个人感觉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* 型!

我现在感觉很烦! 真的很烦!

作者: 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);
};

作者: wonderbeyond   发布时间: 2010-09-06

强制转换一下就行了

作者: 皇家救星   发布时间: 2010-09-06

这么可能不能用c_str()的返回值做参数呢

作者: ydfgic   发布时间: 2010-09-06

由于存到数据库中的内容要求是连续内存空间, 所以那些自行分配内存的类类型对象是不行的
=============

这句话表达不清

作者: ydfgic   发布时间: 2010-09-06

相关阅读 更多