2012-01-24 53 views
8

如果您將其聲明爲類的成員,您可以使用什麼構造函數來實例化fstream?如果你聲明它是一個類的成員,如何實例化一個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 = ??? 
} 

回答

7

在C的新版本++(C++ 11),則具有上述代碼是完全沒有問題;在一個類的主體內部允許初始化。

在C++ 03(以前版本的C++),你可以通過使用成員初始化列表這樣初始化fstream

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

Syntatically,這是通過將後一個冒號做構造函數名稱,但在大括號之前,然後列出要初始化的字段的名稱(此處爲myFile),然後在括號中使用要用來初始化的參數。這將導致myFile正確初始化。

希望這會有所幫助!

+0

你能在這個新的C++ 2011的功能,讓您使用展開「初始化被允許類的身體裏面。」?當我輸入構造函數的主體時,所有成員都很容易初始化......我當時有一種明顯的印象... –

+1

@DietmarKühl-當然!在C++ 11中,可以將默認值分配給每個類的字段。如果它們沒有被初始化列表中特定的東西覆蓋,那麼它們被初始化,就像它們在初始化列表中初始化一樣。 – templatetypedef

+0

難怪C++變得如此深奧! – likejiujitsu

4

另一種選擇是:

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

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

    //other initialization 
} 
相關問題