用ifstream构造一个类诗人,然后用相同的ifstream构造它的成员类诗句
Constructing a class Poet with ifstream and then constructing it's member class Verse with same ifstream
想象一个名为Poet的类,其成员FirstName,LastName和名为Verse的类作为Poet的成员。 是否可以使用 ifstream 构造 Poet,然后使用 ifstream 初始化 FirstName 和 LastName,然后使用相同的 ifstream 构造成员 Verse?我的意思是,在初始化某些成员后,如何将 ifstream 从一个类正确传递到它的成员类?谢谢。
第 1 步:将运算符>>添加到 Verse 中
这是一个完全微不足道的>>
,基于运算符重载的基本规则和习语是什么?
由于我不知道Verse
里面应该包含什么,所以我坚持一行的字面定义。
friend std::istream& operator>>(std::istream& in, Verse & obj)
{
std::getline(in, obj.line);
return in;
}
这使您可以从任何流(而不仅仅是fstream
)读取到Verse
中。在有意义的地方,从最高的抽象级别开始工作,以获得更通用的解决方案。
第 2 步:在构造函数中使用Verse
的>>
。
我正在掷硬币,看看这在构造函数中是否是一件好事。构造函数与任何其他函数一样,应该执行一项工作。构造函数的工作是初始化对象。从文件读入通常可能会超出一个作业规则。另一个原因是(或应该)只有两种方法可以摆脱构造函数:使用初始化的对象或抛出的异常,并且异常成本很高。IO 有很大的出错空间,因此您可能会发现自己引发异常的频率比您希望的要高。
Poet(std::istream & in)
{
in >> FirstName >> LastName >> Verse;
if (!in)
{
throw std::runtime_error("Aaaaaaaarrrggghhhh!");
}
}
再次注意,我将输入流从文件流扩展到所有istream
以概括函数。
如果有任何读取失败,也不是例外。你得到一个对象,或者你没有。
最后说明(巴林编辑)这个解决方案在面对像"约翰·冯·歌德"这样的诗人名字时失败得很惨,因为它只接受一个词的名字。
我找到了另一种方法。 诗人:
private:
std::string FirstName;
std::string LastName;
int BirthYear;
bool IsAlive;
int DeathYear;
Verse FirstVerse;
类 诗人重载构造函数 在 诗人.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
- 为什么在C++中首先初始化成员类
- 非虚拟基的多态成员类
- 当从成员类调用封装的std::begin时,程序崩溃
- 从私有成员类中断封装派生的模板类
- 异常成员类 OOP
- 如何从外部类 (c++) 构造成员类对象
- 调用虚拟成员类的方法
- C++11 成员类初始化顺序
- 成员类函数
- 用ifstream构造一个类诗人,然后用相同的ifstream构造它的成员类诗句
- 如何重用包含 std::ifstream 的类
- 从成员类功能创建线程
- 如何在c++中实现内部抽象成员类
- 初始化静态成员类(用于信号处理程序)
- C++ 定义不带模板参数的成员类的类型
- 模板类中的不可复制静态 const 成员类
- 成员类是否可以从其父类继承?
- 成员类之间的通信的正确方式是什么?
- 对成员类/对象变量使用指针更好吗
- 用错误检查初始化ifstream的类成员初始化器