【问题标题】:How to instantiate an fstream if you declare it as a member of a class?如果将 fstream 声明为类的成员,如何实例化它?
【发布时间】:2012-02-18 03:10:09
【问题描述】:

如果您将 fstream 声明为类的成员,您可以使用什么构造函数来实例化它?

#include <fstream>
class Foo {
Foo();
// not allowed
std::fstream myFile("\\temp\\foo.txt", fstream::in | fstream::out | fstream::trunc);

// allowed
std::fstream myFile;
}

// constructor
Foo::Foo() {
// what form of myFile("\\temp\\foo.txt", fstream::in | fstream::out | fstream::trunc)  can I use here?


myFile = ???
}

【问题讨论】:

    标签: c++ iostream


    【解决方案1】:

    在新版本的C++(C++11)中,上面的代码就可以了;允许在类的主体内进行初始化。

    在 C++03(C++ 之前的版本)中,您可以像这样使用 member initializer list 来初始化 fstream

    Foo::Foo() : myFile("file-name", otherArguments) {
        // other initialization
    }
    

    从语法上讲,这是通过在构造函数名称之后但大括号之前添加一个冒号来完成的,然后列出您要初始化的字段的名称(此处为myFile),然后在括号中添加您要使用的参数初始化它。这将导致myFile 被正确初始化。

    希望这会有所帮助!

    【讨论】:

    • 您能否扩展这个新的 C++2011 功能,允许您使用“允许在类的主体内进行初始化。”?我的印象是,当输入构造函数的主体时,所有成员都很容易初始化......
    • @DietmarKühl- 当然!在 C++11 中,您可以为类的每个字段分配默认值。如果它们没有被初始化列表中的特定内容覆盖,那么它们会像在初始化列表中初始化一样被初始化。
    • @templatetypedef:哦,对:类定义中的成员初始化器。不知怎的,我忘记了那些!感谢您的澄清!
    • @templatetypedef 除了成员初始化需要{}而不是(),所以OP的第一个代码示例不是完全OK。
    【解决方案2】:

    另一种选择是:

    Foo::Foo () {
        myFile.open("\\temp\\foo.txt", fstream::in | fstream::out | fstream::trunc);
    
        if(!myFile.is_open()) {
            printf("myFile failed to open!");
        }
    
        //other initialization
    }
    

    【讨论】:

      猜你喜欢
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多