使用帮助器类接口写入文件,我在哪里打开ofstream?

您所在的位置:网站首页 腾讯微云在哪里打开文件 使用帮助器类接口写入文件,我在哪里打开ofstream?

使用帮助器类接口写入文件,我在哪里打开ofstream?

2023-07-24 21:24| 来源: 网络整理| 查看: 265

让你很难回答你的问题的是,真正的问题在其他地方:

FileIO是Account类的复合成员数据对象。

为了正确的separation of responsibilities,FileIO不应该是Account的成员。

相反,它应该是一个单独的类。使用这种SOLID-type设计,打开ofstream的问题很容易解决,因为这可以在例如构造函数中完成:

class FileIO { private: ofstream _accoFile; public: FileIO(const std::string& filename) : _accoFile(filename) {}; void WriteData(Account*); };

使用此设计:

一旦创建FileIO;Several实例,输出文件就会打开。可以将Account的实例序列化为相同的输出文件; FileIO实例一旦销毁,输出文件就会自动关闭。

下面是一个简单的main,演示了如何使用这样的序列化程序:

int main() { std::vector accountsVec; FileIO writer("accInfo.txt"); for (int i = 0; i < accountsVec.size(); i++) { writer.WriteData(accountsVec[i]); } return 0; }

更新

我知道赋值要求所有Account实例都有一个通用的成员序列化程序。这真的很奇怪,所以可能值得再检查一遍。在任何情况下,基于这些奇怪的要求,以下是我能想到的。

序列化程序可以使用典型的I/O open和close方法进行设计:

class FileIO { private: ofstream _accoFile; public: void open(const string& filename) { _accoFile.open(filename); } void close() { _accoFile.close(); } void WriteData(Account*); };

由于序列化程序是Account的复合成员,因此应将其集成到Account ctor中:

Account::Account(Person* accOwner,int accNumber,double accBalance,FileIO* iFile) : _accOwner(accOwner), _accNumber(accNumber), _accBalance(accBalance), _iFile(iFile) {}

如果Account被赋予了将自身保存到目标文件中的责任,那么最好编写一个实现该责任的Account方法:

void Account::WriteData() { _iFile->WriteData(this); }

以下是基于此设计的main示例:

int main() { FileIO fileio; Person person1{"toto","Paris"}; Person person2{"tutu","London"}; Person person3{"tata","Lisboa"}; vector accountsVec; accountsVec.emplace_back( &person1 , 1, 12., &fileio ); accountsVec.emplace_back( &person2 , 2, 100., &fileio ); accountsVec.emplace_back( &person3 , 3, 1000., &fileio ); fileio.open("accInfo.txt"); for (int i = 0; i < accountsVec.size(); i++) { accountsVec[i].WriteData(); } fileio.close(); }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3