【发布时间】:2021-04-08 06:36:32
【问题描述】:
在我目前正在进行的一个学校项目中,我们必须写入和读取二进制文件。 为了使我的代码更优雅,我选择在其中一个类中使用序列化 ctor,这些类接收一个 ifstream 以从文件中读取以获取其适当的数据。
我们的一个要求是我们需要检查文件是否成功读取,但还不允许以 try-catch 块的形式实现异常处理。因此,如果读取不成功,我能想到的唯一选择是返回一个布尔值。问题是我有嵌套类,例如第一个类看起来像:
class A
{
public:
A(ifstream& input)
{
// read data from input //
// call load method of nested class B //
}
private:
// some data //
B b;
};
并且嵌套类将调用其加载方法来读取适当的数据,而不是具有接收文件的 ctor,因此 B 将如下所示:
class B
{
public:
void load(ifstream& input);
private:
// some data //
};
处理异常的替代方法是什么,或者您建议对我的代码进行哪些更改以使其符合项目要求?
将 B 的加载方法设置为布尔值,并返回 false,例如,如果读数不好会导致我回到 A 的 ctor,我无法从中返回值。
我现在已经用 C++ 编码了几个月,所以如果这里的某些东西看起来像是糟糕的设计或明显错误,我深表歉意 - 也将感谢任何反馈。谢谢。
【问题讨论】:
-
将所有读取代码从构造函数移到必须显式调用的函数中。
-
Class应该是class,Class B;不是成员的声明,您缺少;。我修好了那些 -
读取文件失败应该怎么办?
-
不确定我的编辑是否正常。你说“嵌套类”,所以我将其设为成员的更改可能会关闭
-
构造函数报告错误的主要方式是抛出异常。如果你不能从构造函数中抛出异常,最好避免在构造函数中读取文件(本质上容易出错),而是在另一个可以返回值而不是抛出的函数中读取。另一种方法是设置一些对象状态以指示错误条件 - 如果成员函数忘记检查错误条件并且表现得好像没有发生错误,那么问题几乎总是某种形式的错误(例如未定义)行为。
标签: c++ exception constructor try-catch