在全局变量中保存类的实例以重新创建类(创建"backup")
save an instance of class in global variable in order to resotre the class (creating a "backup")
如果我不清楚,很抱歉,我是新手。我将提供罕见的背景:我有一个名为Restaurant的课程,它有以下字段:
bool open;
std::vector<Table*> tables;
std::vector<Dish> menu;
std::vector<BaseAction*> actionsLog;
其中Table、Dish和BaseAction也是类。
我被要求创建一个全局变量,它将为Restaurant保存一个"备份",这意味着我可以使用这个全局变量在任何时候恢复它。
我的第一个想法是,为Restaurant构建一个好的复制构造函数会成功。但经过思考,我不确定全局变量中的备份将包含什么。我试着解释一下,餐厅的实例保存了一些字段,这些字段的信息不是动态分配的,这些信息保存在哪里?如何恢复我将其保存在全局变量中是否意味着所有信息(堆和堆栈中(都可以在任何范围内浏览
这些问题让我问你什么是正确的方法,它是如何工作的?
如果说错话,再次表示歉意。如果我是,请纠正我。
您创建复制构造函数的本能是正确的。
事实上,如果你做得好,你剩下的问题就没有意义了。
要"备份"您的变量(即创建它的副本(,必须重新创建它的所有状态。
这意味着,它的所有直接成员,通过深度复制…这反过来意味着你的矢量指向的所有元素也需要被克隆。
这将是一团糟;如果不将原始指针存储在容器中,情况就不会那么糟了—事实上,如果容器根本不存储指针,您可以让编译器生成的复制构造函数为您完成这项工作:
Restaurant backup = myMainRestaurant;
诚然,如果您的Table
和BaseAction
是继承层次结构的基础(它们看起来就是继承层次结构(,那么这是不可行的。
不过,我不建议将其作为一个全局变量;你会有各种各样的终身问题。你最好的选择可能是更动态的分配(ugh(:
Restaurant* backup = nullptr;
int main()
{
Restaurant myMainRestaurant;
// ...
backup = new Restaurant(myMainRestaurant);
// ...
delete backup;
}
我推荐明智的建议,但我自己的直觉是,你正在接受教育,这不会被接受(可悲!(。
很遗憾,您未能提供类Table
、Dish
和BaseAction
的详细信息。因此,我假设Dish
和Table
是非多态类,而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;
}
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++类内存结构中创建"spacer"?
- 终端不会为C++文件创建.exe文件吗
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息