在全局变量中保存类的实例以重新创建类(创建"backup")

save an instance of class in global variable in order to resotre the class (creating a "backup")

本文关键字:创建 backup 新创建 全局变量 保存 实例      更新时间:2023-10-16

如果我不清楚,很抱歉,我是新手。我将提供罕见的背景:我有一个名为Restaurant的课程,它有以下字段:

bool open;
std::vector<Table*> tables;
std::vector<Dish> menu;
std::vector<BaseAction*> actionsLog;

其中Table、Dish和BaseAction也是类。

我被要求创建一个全局变量,它将为Restaurant保存一个"备份",这意味着我可以使用这个全局变量在任何时候恢复它。

我的第一个想法是,为Restaurant构建一个好的复制构造函数会成功。但经过思考,我不确定全局变量中的备份将包含什么。我试着解释一下,餐厅的实例保存了一些字段,这些字段的信息不是动态分配的,这些信息保存在哪里?如何恢复我将其保存在全局变量中是否意味着所有信息(堆和堆栈中(都可以在任何范围内浏览

这些问题让我问你什么是正确的方法,它是如何工作的?

如果说错话,再次表示歉意。如果我是,请纠正我。

您创建复制构造函数的本能是正确的。

事实上,如果你做得好,你剩下的问题就没有意义了。

要"备份"您的变量(即创建它的副本(,必须重新创建它的所有状态。

这意味着,它的所有直接成员,通过深度复制…这反过来意味着你的矢量指向的所有元素也需要被克隆。

这将是一团糟;如果不将原始指针存储在容器中,情况就不会那么糟了—事实上,如果容器根本不存储指针,您可以让编译器生成的复制构造函数为您完成这项工作:

Restaurant backup = myMainRestaurant;

诚然,如果您的TableBaseAction是继承层次结构的基础(它们看起来就是继承层次结构(,那么这是不可行的。

不过,我不建议将其作为一个全局变量;你会有各种各样的终身问题。你最好的选择可能是更动态的分配(ugh(:

Restaurant* backup = nullptr;
int main()
{
Restaurant myMainRestaurant;
// ...
backup = new Restaurant(myMainRestaurant);
// ...
delete backup;
}

我推荐明智的建议,但我自己的直觉是,你正在接受教育,这不会被接受(可悲!(。

很遗憾,您未能提供类TableDishBaseAction的详细信息。因此,我假设DishTable是非多态类,而BaseAction是具有布局的多态基类

struct BaseAction
{
virtual BaseAction* clone() const = 0;  // make a copy on the heap
/* more virtual methods irrelevant to this post */
virtual ~BaseAction() {}
};

餐厅本质上是一个C风格的结构。然后,备份可以如下

std::unique_ptr<Restaurant> make_backup(Restaurant const&restaurant)
{
auto backup = make_unique(new Restaurant);
backup->tables.reserve(restaurant.tables.size());
for(auto t : restaurant.tables)
backup->tables.push_back(new Table(*t));       // copy tables
backup.menu = restaurant.menu;                     // copy menu
backup->actionsLog.reserve(restaurant.actionsLog.size());
for(auto a : restaurant.actionsLog)
backup->actionsLog.push_back(a->clone());      // copy actions
return backup;
}