gpt4 book ai didi

c++ - C++中的OOP类设计

转载 作者:太空狗 更新时间:2023-10-29 20:38:44 24 4
gpt4 key购买 nike

我有一个关于 C++ 类设计的简单问题。

假设我们有以下类:

class DataBase
{
public:
DataBase();


void addEntry(const std::string& key, double value);
double getEntry(const std::string& key);

protected:
std::map<std::string, double> table;
};

还有一个类包含一个指向 DataBase 类实例的指针:

class SomeClass
{
protected:
DataBase *someDataBase;
};

这里我很困惑,因为我想到了两个选项:

  1. SomeClass 的每个实例都有自己的数据库。从某种意义上说,只有该实例添加的数据才会出现在该数据库(专用数据库)中。
  2. SomeClass 的每个实例都将引用一个中央数据库。 SomeClass 的任何实例添加的数据将在一个数据库(全局数据库)中。

问题:

  • OOP 中上述概念的名称是什么?
  • 如何在 C++ 中实现上述每种方法

最佳答案

您正在寻找的是 C++ 中的所有权主题。当我说所有权时,我的意思是谁负责管理保存对象的内存。

在您的第一个示例中,每个 SomeClass 可以拥有自己的 DataBase

class SomeClass
{
private DataBase *db;
public SomeClass();
public SomeClass(DataBase* db);
public ~SomeClass();
}

SomeClass::SomeClass()
{
this.db = new DataBase();
}

SomeClass::SomeClass(DataBase* db)
{
this.db = db;
}

SomeClass::~SomeClass()
{
delete this.db;
}

这个 SomeClass 要么取得赋予它的数据库的所有权,要么创建自己的数据库(实际上,您通常会做其中之一)。这意味着您可以传入 DataBase 对象(使用称为依赖注入(inject)的概念):

DataBase *db = new DataBase();
SomeClass sc(db);
sc.doSomeStuffWithDB();

或者让类创建 DataBase 对象:

SomeClass sc();
sc.doSomeStuffWithDB();

在上面的示例中,您不必担心 DataBase 对象的处理,因为知道 SomeClass 应该在其析构函数中处理处理。

在另一种情况下,您可以共享一个DataBase,而无需让您的SomeClass 处理它(无论它是否是全局的都无关紧要)。

class SomeClass
{
private DataBase *db;
public SomeClass(DataBase* db);
}

SomeClass::SomeClass(DataBase* db)
{
this.db = db;
}

在这里,我们可以将多个 SomeClass 对象传递给同一个 DataBase,而不必担心它们会被任何对象丢弃。

DataBase *db = new DataBase();
SomeClass *sc1 = new SomeClass(db);
SomeClass *sc2 = new SomeClass(db);
sc1.doSomeStuffWithDB();
delete sc1;
sc2.doSomeStuffWithDB();
delete sc2;
delete db;

在这种情况下,我们能够在将 SomeClass 对象外部处理之前重用 DataBase 对象。实际上,这种处置可以由另一个类(如 DataBaseStore)管理,让您有一种可靠的方式来处理和重用 DataBase 对象。

关于c++ - C++中的OOP类设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30644495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com