如何从文本文件 C++ 创建对象?
Posted
技术标签:
【中文标题】如何从文本文件 C++ 创建对象?【英文标题】:How to make object from text file C++? 【发布时间】:2020-04-16 14:18:10 【问题描述】:我必须在我的项目中实现多态性。我有一个名为“Account”的虚拟课程。然后有 4 个子类:美元、欧元、英镑和瑞士法郎。 我需要从这样的文本文件中读取当前余额:
USD 50
CHF 80
GBP 10
EUR 90
并根据货币创建一个子类。 每种货币都应该有自己的对象。稍后在程序中,我将实现货币兑换,汇率将从文件中读取。我不知道如何从这些课程开始。我应该学习什么?
到目前为止我的代码:
class Account
std::string currency;
public:
virtual void balance() = 0;
;
class currencyAcc: public Konto
std::string currency;
float balance;
walutowe(std::string currency,float balance)
this->currency= currency;
this->balance= balance;
void AccBallance()
std::cout << balance<< std::endl;
;
【问题讨论】:
不是答案,但我建议在基类中设置std::string currency
protected 以便能够在派生类中使用它。
另外,文本文件USD 0 CHF 0 GBP 0 EUR 0
是否只有一行?每种货币在文件中只存在一次吗?我的理解是,对于USD 0
,我们创建了一个余额为 0 的 USD 对象,对于其余的每个对象也是如此?我说的对吗?
它应该从文件中读取,分 4 行。数字代表平衡,它可以是任何数字。我的意图是根据文本文件中的内容创建一个对象
请注意,在my answer 中,我只是在指导您从文件中解析货币的实现。如果您需要有关类和程序结构的帮助,并且您已经尝试过并且遇到了卡住/错误,只需展示努力并询问!
【参考方案1】:
我应该学习什么?
好吧,如果您已经掌握了基础知识,那么您肯定需要一些练习和指导!
你可以有一个全局函数:
读取文本文件块, 动态解析和创建正确的对象(基于某些条件),并且 返回一个指向对象的指针(转换为基类):Account * parseOne(std::fstream& file); // Reference to opened file
即使您只想要代码,您仍然需要进行解释。 :) 让我们从一般意义上来看待它。
读一行
很简单:
std::getline(file, line);
它。您还应该检查读取是否成功。
解析它
你可以这样做:
std::stringstream parse_me(line);
parse_me >> some_data_1;
parse_me >> some_data_2;
...
创建您的对象...
这里需要在currency_type
的基础上创建。做:
if(currency_type == "GBP")
new_currency_object = new GBP(balance);
对于每个派生类。
...和守则:
把它放在一起:
Account * parseOne(std::fstream& file) // Reference to opened file
// To read a line from the file
std::string line;
// If the read failed, return NULL
if(!std::getline(file, line))
return 0;
// Read success
// Using stringstream so that different types of data can be parsed
std::stringstream line_buffer(line);
// Declare variables to be parsed
std::string currency_type;
float balance;
// Now parse it (note the order!)
line_buffer >> currency_type >> balance;
// Create a pointer to base...
Account * new_currency_object;
// ...and create the object based on the currency_type
if(currency_type == "USD")
new_currency_object = new USD(balance);
... for each currency
// We are done, return the fruits of our labour
return new_currency_object;
(请注意,我假设您有一个 USD(float balance)
构造函数。如果没有,请自行设置 balance
)
用作:
// open the file
std::fstream currency_file("my_currencies.txt");
// Read a currency
Account * a_currency;
// When the read finishes, we get NULL
while(a_currency = parseOne(currency_file))
// do something with a_currency. Maybe:
// list_of_currencies.push_back(a_currency) it?
编辑:完成后一定要释放内存!事实上,use of new
and raw pointers are not encouraged 了。感谢this comment 的建议。
如需进一步阅读,请参阅How to implement the factory method pattern in C++ correctly
。
祝你好运!
【讨论】:
@克劳斯:谢谢。我道歉。我从上面的答案中学到了。从现在开始,我将对拥有的内存使用原始指针,而不是std::unique_ptr
。此外,我将重新开始在 C++ 中使用 new
。为了实现上述想法,我将重构我给出的关于工厂的答案(例如:***.com/questions/59015776/…)。我现在知道有更好的解决方案。我认为从架构的角度来看,从账户中派生货币是一个好主意。这条评论很快就会被删除
@ArminMontigny 好吧,每个人的想法都不一样。在这种情况下,发布更好的答案!我相信它会被赞成(如果它很好,我会自己这样做)并且 OP 可以接受它作为最佳答案。我也会从中学习。 :-) 至于程序的结构,我自己没有发表评论。也许你也可以把那部分加进去?【参考方案2】:
您需要一个在构造函数中接受货币代码的 Currency 类。 Currency 类的对象可以通过组合成为帐户的一部分,而不是数据类型为字符串的当前货币。
【讨论】:
我的主要问题是从文本文件 ``` 类 USD: public Konto ``` ``` 类 EUR: public Konto ``` ``` 类 CHF: public Konto ``` ``` 类 GBP:public Konto ``` 这是家庭作业,还是真实世界的应用程序?在现实世界的应用程序中,您将有一个用于 Currency 的类,甚至更好的是一个用于 Amount 的类,它接受货币代码以及货币的精度作为属性。请通过创建 4 个子类来解释您的意思。你的意思是,你需要继承一个叫做货币的抽象基类吗? 这是作业。我正在用4种货币制作简单的钱包,我必须实现货币兑换,存款和取款。所有货币都应该是单独的类,虚拟类是Account,Currency子类class USD:public Account
只是为了实现多态以上是关于如何从文本文件 C++ 创建对象?的主要内容,如果未能解决你的问题,请参考以下文章