C++ 对象设计问题 : efficiently and safely construct objects and save/load with database

标签 c++ object

我的英语不够好,无法解释我的问题。但我会尽力而为。

我曾经是一名 Java 程序员,但使用 C++ 已经一年多了。一直困扰我的一件事是从网络(如通过 SNMP、Web 服务或其他数据源...)创建业务对象并将其保存到数据库并在应用程序启动时加载它的策略。通常我的设计如下:


class Object{
/* this is just a demonstration, in real code, there are all kinds of Object and has relationships*/
friend class DBConnection;
friend class SNMPConn
private:
    std::string& m_strName; 
    //... all kinds of properties
}

class DBConnection
{
   int load(Object& obj);
   int save(Object& obj);
   int modify(Object& obj);
   int loadAll(std::vector);
}

class SNMPConn
{
   int load(Object& obj);
   ...
}

我不太适应的是“ friend 类......”这句话。它打破了封装。我找到了一些框架,如 litesql(sourceforge.net/apps/trac/litesql) 和其他商业框架,但这些框架很难与我现有的代码集成。我正在尝试手动完成并尝试为此类工作找到通用策略。

我是一个 Java 开发者,C++ 设计是我不擅长的事情。我不知道这种设计工作的最佳实践是什么。

最佳答案

据我从这个问题(在读取和写入 DB 或 SNMP 连接时破坏封装)了解到,首先你需要一个适当的设计来消除这些“ friend ”。请为连接(即 IDBConnection)和持久对象(即 IPersistent)定义一个抽象类。您可以使用“抽象工厂”模式来创建它们。此外,将加载和保存方法隔离到另一个类,并使用“访问者模式”从数据库初始化对象或将对象保存到数据库。

还有一点,如果您的应用程序需要嵌入式数据库,请使用 SQLite有很多好的 C++ 包装器。希望对你有帮助

关于C++ 对象设计问题 : efficiently and safely construct objects and save/load with database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2646417/

相关文章:

c++ - 链接动态和静态库 Rcpp

JavaScript : Rearrange array elements according to the absolute difference with x

c++ - 在循环内填充 C++ 对象字段会导致空字段

javascript - 需要调用一个已经失去作用域的函数

c++ - 为什么在 C++ 中声明数组时必须添加赋值符号?

c++ - 如何在命名空间std中转发声明模板类?

c++ - 如何使用 libcurl 和 POP3 删除电子邮件?

c++ - 如何修改Makefile以支持交叉编译?

Java 对象引用机制

javascript - 为什么将变量作为属性添加到循环中的对象时,第一次会添加变量的实际名称作为属性?