2012-01-24 9 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

सी के नए संस्करण में ++ (सी ++ 11), तो उपरोक्त कोड आप बिल्कुल ठीक है; कक्षा के शरीर के अंदर प्रारंभिकरण की अनुमति है।

C++ में 03 (सी ++ के पिछले संस्करण), तो आपको fstream इस तरह सदस्य प्रारंभकर्ता सूची का उपयोग करके प्रारंभ कर सकते हैं:

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

Syntatically, इस के बाद एक कॉलन जोड़कर किया जाता है कन्स्ट्रक्टर का नाम लेकिन ब्रेस से पहले, फिर उस फ़ील्ड का नाम सूचीबद्ध करें जिसे आप प्रारंभ करना चाहते हैं (यहां, myFile), और उसके बाद उन तर्कों को संकुचित करता है जिन्हें आप प्रारंभ करना चाहते हैं। यह ठीक से शुरू करने के लिए myFile का कारण बन जाएगा।

आशा है कि इससे मदद मिलती है!

+0

आप इस नए सी ++ 2011 सुविधा का उपयोग करने के लिए अनुमति पर विस्तार कर सकते हैं "initializations एक वर्ग के शरीर के अंदर की अनुमति है।"? मैं अलग-अलग प्रभाव के तहत था कि सभी सदस्यों को आसानी से प्रारंभ किया जाता है जब निर्माता का शरीर प्रवेश किया जाता है ... –

+1

@ डाइटमारकुहल- ज़रूर! सी ++ 11 में, आप कक्षा के प्रत्येक फ़ील्ड में डिफ़ॉल्ट मान असाइन कर सकते हैं। यदि वे प्रारंभकर्ता सूची में विशिष्ट कुछ द्वारा ओवरराइड नहीं किए जाते हैं, तो उन्हें प्रारंभ किया गया है जैसे कि वे प्रारंभकर्ता सूची में प्रारंभ किए गए थे। – templatetypedef

+0

कोई आश्चर्य नहीं कि सी ++ इतनी परेशान हो गई! – 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 
} 
संबंधित मुद्दे

 संबंधित मुद्दे