如何从文本文件 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++ 创建对象?的主要内容,如果未能解决你的问题,请参考以下文章

在C++中如何读取文本中的数据存储为数组变量?

C++ 从文本文件检查操作系统

从文本文件c ++填充对象

如何用两列 C++ 从文本文件中填充向量

从具有多个对象的文本文件创建对象

mfc c++ 从编辑控件更新文本文件