用ifstream构造一个类诗人,然后使用相同的ifstream构造它的成员类Verse

时间:2018-01-30 21:37:06

标签: c++ class ifstream member

想象一个名为Poet的类,其成员名为FirstName,LastName和名为Verse的类为Poet的成员。是否可以使用ifstream构建Poet,然后使用ifstream初始化FirstName和LastName,然后使用相同的ifstream构造成员Verse?我的意思是,在初始化一些成员后,如何正确地将ifstream从一个类传递给它的成员类?感谢。

2 个答案:

答案 0 :(得分:0)

第1步:添加运算符>>到诗歌

根据What are the basic rules and idioms for operator overloading?

,这是一个完全无关紧要的>>

由于我不知道Verse内部应该是什么,所以我坚持使用一行的字面定义。

friend std::istream& operator>>(std::istream& in, Verse & obj)
{
    std::getline(in, obj.line);
    return in;
}

这使您可以从fstream中的任何信息流中读取Verse。在有意义的地方,从最高级别的抽象开始,以获得更通用的解决方案。

第2步:在构造函数中使用Verse的{​​{1}}。

我正在翻转一个硬币,看看在构造函数中这是否是一件好事。与任何其他函数一样,构造函数应该完成一项工作。构造函数的工作是初始化一个对象。从文件中读取可能经常超越一个作业规则。另一个原因是构造函数中只有两种方式(或者应该):使用初始化对象或抛出异常,异常是昂贵的。 IO有很多错误的余地,所以你可能会发现自己比你想要的更频繁地抛出异常。

>>

再次注意我已将输入流从文件流扩展到所有Poet(std::istream & in) { in >> FirstName >> LastName >> Verse; if (!in) { throw std::runtime_error("Aaaaaaaarrrggghhhh!"); } } 以扩展该功能。

如果读取失败也不例外。你得到一个对象,或者你没有。

最后的笔记(Baring edits)这个解决方案在面对诗人名字“Johann von Goethe”时非常失败,因为它只会接受一个单词的名字。

答案 1 :(得分:0)

我找到了另一种方式。 Poet.h:

private:
std::string FirstName;
std::string LastName;
int BirthYear;
bool IsAlive;
int DeathYear;
Verse FirstVerse;

类诗人在Poet.cpp中重载了构造函数:

Poet::Poet(std::ifstream & in):DeathYear(0)
{
    std::getline(in, FirstName);
    std::getline(in, LastName);
    in >> BirthYear;
    in >> IsAlive;
    setDeathYearIfNotAlive(in);

    //in >> FirstVerse;

    FirstVerse.~Verse();
    new(&FirstVerse) Verse(in);
}

注意,“in”没有重载的朋友运算符>>,它是基本的std::ifstream in