【发布时间】:2012-09-06 20:02:53
【问题描述】:
我来自 Java 背景,但后来我学习了 C++,并且已经使用它编程了几年(主要是调试和编写修复程序,而不是从头开始设计程序)。但是,我今天遇到了一个问题,坦率地说,我有点惊讶花了这么长时间才遇到它。
假设我有一个名为 Class1 的类,其头文件包含(以及其他代码):
class Class1 {
private:
Class2 object;
}
Class2 类没有指定默认构造函数。现在,在 Class1 构造函数中,我正在读取文件的二进制标头并使用从中解析的信息来初始化 Class2,如下面的伪代码所示:
Class1::Class1(std::string) {
// Read some binary info from a file here
// Parse that binary info
object2 = Class2(info);
在 Java 中,因为它不使用 RAII 范式,所以这是完全合法的。但是,由于 C++ 使用 RAII,所以在我执行 object2 = Class2(info); 时,对象 2 已经使用其默认构造函数进行了初始化。我最初无法调用该构造函数(在 Class1 头文件中),因为我还没有创建 object 所需的信息。但是,我不能只将 object2 设置为构造函数的本地,因为我需要其他函数才能看到/使用它。
显然这行不通。这些东西的标准方法是什么?我实际上想过只是将 Class1 更改为拥有一个 Class2 指针,如下所示:
class Class1 {
private:
Class2* objectPointer;
}
然后调用*objectPointer = Class2(info)。但是,在我的情况下,“Class2”是一个 ifstream,似乎 operator= 函数已被删除,并且不适用于任何一种方法。
那么...我该怎么做呢?
【问题讨论】:
-
哈哈!
-
我认为说“C++ 使用 RAII”不太正确。 C++ 启用 RAII,但不需要使用它。
-
请注意,RAII 是一个很棒的功能的可怕名称。虽然名称暗示了初始化,但重要的方面是破坏:每个资源都应该由一个类管理。它不支持/反对 2 阶段初始化(尽管您可能希望尽可能避免它)
-
@RobK 是的,我可能应该更仔细地措辞我的问题......类似于“但是,因为 C++ 允许 RAII 并且它通常是很好的做法”或类似的东西。
标签: c++ constructor raii