2010-07-16 16 views
6

एक बुनियादी सवाल का थोड़ा सा, लेकिन मुझे एक निश्चित उत्तर को ट्रैक करने में कठिनाई हो रही है।कक्षा क्षेत्रों को कैसे शुरू किया जा सकता है?

प्रारंभकर्ताओं में केवल तरीका सी ++ में कक्षा फ़ील्ड प्रारंभ करने के तरीकों के अनुसार, विधियों में असाइनमेंट के अलावा सूचीबद्ध हैं?

class Test 
{ 
public: 
    Test(): MyField(47) { } // acceptable 
    int MyField; 
}; 

class Test 
{ 
public: 
    int MyField = 47; // invalid: only static const integral data members allowed 
}; 

संपादित:

मामले में मैं गलत शब्दावली का उपयोग कर रहा है, यहाँ मैं क्या मतलब है विशेष रूप से, वहाँ एक struct प्रारंभकर्ता के साथ एक struct क्षेत्र प्रारंभ करने में एक अच्छा तरीका है? उदाहरण के लिए:

struct MyStruct { int Number, const char* Text }; 

MyStruct struct1 = {}; // acceptable: zeroed 
MyStruct struct2 = { 47, "Blah" } // acceptable 

class MyClass 
{ 
    MyStruct struct3 = ??? // not acceptable 
}; 
+0

C++ में रिक्त ब्रेसेस साथ struct उदाहरण सामान्य रूप से ध्यान केंद्रित किया नहीं किया जाएगा, लेकिन कचरा मूल्य होगा। अपवाद एक डीबग पर्यावरण या इसी तरह नियंत्रित स्थिति में हो सकता है। –

+0

@SEinarsson - ओह ... क्या आपके पास इसका संदर्भ है? C++ में structs प्रारंभ करने के लिए पूरे वेब पर खाली ब्रेसिज़ की अनुशंसा की जाती है। –

+0

रुको, अब मैं इतना निश्चित नहीं हूं। मैंने वेब पर लोगों को यह कहते हुए पाया है कि मैं गलत हूं लेकिन {} पैटर्न के लिए कोई औपचारिक परिभाषा नहीं है। निम्नलिखित प्रश्न का तात्पर्य है कि सी ++ में स्ट्रक्चर-क्लासेस में डिफॉल्ट कन्स्ट्रक्टर शून्य होते हैं, जब क्लास प्रारंभकर्ता में उपयोग किया जाता है (दूसरा उत्तर देखें) http://stackoverflow.com/questions/112085/is-this-c- संरचना- प्रारंभिक- चाल-सुरक्षित मेरी उपरोक्त टिप्पणी को तब तक नज़रअंदाज़ करें जब तक कि मैं इसे स्पष्ट नहीं कर सकता। –

उत्तर

5

सी ++ x0 में दूसरे तरीके से भी काम करना चाहिए।

क्या प्रारंभकर्ता सी ++ में कक्षा फ़ील्ड को प्रारंभ करने का एकमात्र तरीका सूचीबद्ध करता है?

आपके कंपाइलर के साथ आपके मामले में: हाँ।

0

अनुशंसित और पसंदीदा तरीका कन्स्ट्रक्टर में सभी फ़ील्ड को आरंभ करना है, जैसा कि आपके पहले उदाहरण में है। यह structs के लिए भी मान्य है। यहाँ देखें: Initializing static struct tm in a class

3

स्टेटिक सदस्यों को अलग ढंग से initialised जा सकता है:

class Test { 
    .... 
    static int x; 
}; 

int Test::x = 5; 

मैं अगर आप इस 'अच्छा' कहते हैं पता नहीं है, लेकिन आप तो जैसे काफी सफाई से struct सदस्यों आरंभ कर सकते हैं:

struct stype { 
const char *str; 
int val; 
}; 

stype initialSVal = { 
"hi", 
7 
}; 

class Test { 
public: 
    Test(): s(initialSVal) {} 
    stype s; 
}; 
+0

"नाइस" निश्चित रूप से व्यक्तिपरक है। Structs को प्रारंभ करने के तरीके के लिए धन्यवाद - मुझे यह अनूठा लगता है, लेकिन यह देखते हुए कि मेरे पास कोई विकल्प नहीं है ... :) –

1

बस का उल्लेख है कि कुछ मामलों में, आप कोई विकल्प नहीं है लेकिन प्रारंभकर्ता सूचियों का उपयोग करने के लिए निर्माण पर एक सदस्य के मान को सेट करने के लिए:

class A 
{ 
private: 

    int b; 
    const int c; 

public: 

A() : 
    b(1), 
    c(1) 
{ 
    // Here you could also do: 
    b = 1; // This would be a reassignation, not an initialization. 
     // But not: 
    c = 1; // You can't : c is a const member. 
} 
}; 

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

  • कोई संबंधित समस्या नहीं^_^