C++两次从文件保存对象读取多重继承
C++ multiple inheritance reading from file save object twice
首先让我解释一下我的层次结构:
Animal
/ |
Mammal Fish Birds
/ /
Horse MammalFish Flamingo
/
Mermaid GoldFish
每个类都有以下方法:
Save(ofstream & ofs) // Saves the data to txt file
Load(ifstream & ifs) // Load the data from txt file
Constructor(ifstream & ifs) { Load(ifs) } // Constructor from file, uses `Load` method.
每个类实现自己的 Load/Save 方法(如果它们有任何数据成员(,并调用层次结构 Load/Save 方法中的前一个类。
问题在于我的多重继承,当我使用Mermaid
或GoldFish
Save 方法时,它会保存动物两次(这基本上是有道理的(,但我找不到避免这种情况的方法。
另一个问题是构造函数,它会自动调用所有基类默认构造函数(这是不需要的,应该只调用调用基类方法的Load()
(。我不能显式调用基类构造函数,因为在我的Load()
方法中,我也调用基类Load()
方法,这将使我使用Load()
两次。
谢谢。
虚拟继承应该解决继承树中MammalFish
存在的菱形问题。此外,它还要求您将 Load 和 Save 方法声明为虚拟方法,如果它们将位于所有类中。
对于构造函数问题,每个子类构造函数将首先调用基类构造,以确保基类正确初始化;这就是继承的工作方式。在您的情况下,您可以考虑不从构造函数调用Load
。相反,它应该从单独的初始化方法调用。
我想到了一些我以前从未听说过的东西,所以这可能是一个坏主意,但无论如何; 这应该有效:
通过endLoad()
呼叫跟踪每个load()
呼叫。每个对象仅执行load()
序列中的一个load()
,并忽略后续,直到遇到endLoad()
。
相关文章:
- 保存文件并使控制台不关闭:Visual Studio 2019
- 将值更改为 c++ 的数组并保存文件
- 如何保存文件中的所有数据?C++
- 更改代码::块上的默认保存文件类型
- 使用setW()函数保存文件时,如何获取每个属性的值
- 尝试使用 ostream 保存文件内容时出错
- 如何使用3d的max 2016 SDK(C++)在插件中添加保存文件对话框?
- 如何在不保存文件的情况下制作打印屏幕并将其发送到FTP服务器?我的工作代码将文件保存到HDD
- 视频编写器功能不会使用 OpenCV-3.0.0 保存文件
- 使用fstream明确保存文件,而无需在C 中关闭文件
- 位换档字符串以解码保存文件C
- QFile在程序退出时保存文件,根本不会保存~500MB文件
- 保存文件或文件夹的时间戳
- Fstream不会保存文件中的最后一个单词,也不会从文件中读取
- CFileDialog保存文件的名称为空
- 如何以正确的编码保存文件
- 在动态分配的 char 数组中保存文件的类内容
- 如何在win32中使用GetSave文件名保存文件
- 覆盖保存文件的非常安全的方法
- 除非先使用MS Paint打开/保存文件,否则带有QRCode位图的LoadImage()将失败