Как создать экземпляр потока, если вы объявляете его членом класса? - PullRequest
9 голосов
/ 25 января 2012

Какой конструктор вы можете использовать для создания экземпляра потока, если вы объявите его как член класса?

#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 = ???
}

Ответы [ 2 ]

7 голосов
/ 25 января 2012

В новой версии C ++ (C ++ 11) приведенный выше код прекрасно работает;инициализации разрешены внутри тела класса.

В C ++ 03 (предыдущая версия C ++) вы можете инициализировать fstream, используя список инициализаторов .:

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

Синтетически, это делается путем добавления двоеточия после имени конструктора, но перед фигурной скобкой, затем перечисления имени поля, которое вы хотите инициализировать (здесь myFile), а затем взаключите в скобки аргументы, которые вы хотите использовать для его инициализации.Это приведет к правильной инициализации myFile.

Надеюсь, это поможет!

5 голосов
/ 25 января 2012

Другой вариант:

Foo::Foo () {
    myFile.open("\\temp\\foo.txt", fstream::in | fstream::out | fstream::trunc);

    if(!myFile.is_open()) {
        printf("myFile failed to open!");
    }

    //other initialization
}
...