2010-05-02 11 views
5

मेरे पास कोड का एक सेट है, जो एक मूल पुस्तकालय सूचीकरण प्रणाली की नकल करता है। आइटम नामक एक बेस क्लास है, जिसमें सामान्य आईडी, शीर्षक और वर्ष चर परिभाषित किए जाते हैं और 3 अन्य व्युत्पन्न कक्षाएं (डीवीडी, पुस्तक और सीडी) हैं।इन चेतावनियों के साथ मदद करें। [विरासत]

बेस [आइटम]

व्युत्पन्न [डीवीडी, पुस्तक, सीडी]।

प्रोग्राम चलाते हैं, हालांकि मुझे निम्नलिखित चेतावनियां मिलती हैं, मुझे यकीन नहीं है कि इन्हें कैसे ठीक किया जाए।

 
>"C:\Program Files\gcc\bin/g++" -Os -mconsole -g -Wall -Wshadow -fno-common mainA4.cpp -o mainA4.exe 
In file included from mainA4.cpp:5: 
a4.h: In constructor `DVD::DVD(int, std::string, int, std::string)': 
a4.h:28: warning: `DVD::director' will be initialized after 
a4.h:32: warning: base `Items' 
a4.h:32: warning: when initialized here 
a4.h: In constructor `Book::Book(int, std::string, int, std::string, int)': 
a4.h:48: warning: `Book::numPages' will be initialized after 
a4.h:52: warning: base `Items' 
a4.h:52: warning: when initialized here 
a4.h: In constructor `CD::CD(int, std::string, int, std::string, int)': 
a4.h:66: warning: `CD::numSongs' will be initialized after 
a4.h:70: warning: base `Items' 
a4.h:70: warning: when initialized here 
>Exit code: 0 

उत्तर

28

जब आप किसी वर्ग में सदस्य चर घोषित करते हैं, तो वे उन्हें घोषित करने के क्रम में आरंभ होते हैं। लेकिन आप उन्हें अपने कन्स्ट्रक्टर की प्रारंभिक सूची में किसी भी क्रम में लिख सकते हैं। उदाहरण के लिए,

struct foo { 
    int a; 
    int b; 

    foo(): b(5), a(3) {} 
}; 

a और तोb का निर्माण करेगी, भले ही ऐसा लगता है कि आप उन्हें अन्य क्रम में आरंभ कर रहे हैं।

कंपाइलर चेतावनी जारी करता है क्योंकि आप गलत कोड लिखने के लिए खुद को धोखा दे सकते हैं। उदाहरण के लिए,

struct foo { 
    int a; 
    int b; 

    foo(): b(5), a(b) {} 
}; 

a का मूल्य अपरिभाषित कर दिया जाएगा।

+0

आपको बहुत धन्यवाद – silent

+0

ग्रेट उत्तर, धन्यवाद। –

3

जब आप कन्स्ट्रक्टर में कक्षा के सदस्यों को प्रारंभ करते हैं, तो उन्हें उसी क्रम में प्रारंभ करें जिसमें उन्हें घोषित किया जाता है। उदा .:

class Foo { 
    public: 
    int a; 
    int b; 
    Foo() : a(0), b(0) {} 
}; 

Foo() निर्माता में, a और b का क्रम आपके चेतावनी का कारण बन स्विचन। आधार वर्गों को शुरू करने के लिए भी यही जाता है (जिनके रचनाकारों को स्पष्ट रूप से बुलाया जाता है, किसी भी डेटा सदस्य प्रारंभकर्ता से पहले कहा जाना चाहिए)।

6

आपको अपने रचनाकारों और सदस्य प्रारंभिक सूचियों को देखने की आवश्यकता है। कोड को देखे बिना बताना मुश्किल है, लेकिन क्या हो रहा है कि आपके पास कोड है: -

class my_class : public base1, public base2 
{ 
    public: 
     my_class(); 

    private: 
     member1 member1_; 
     member2 member2_; 
} 

my_class::my_class() 
    : member2_(...) 
    , member1_(...) 
    , base2_(...) 
    , base1_(...) 
{ } 

यह इसी तरह की चेतावनियां उत्पन्न करेगा। कारण यह है कि सी ++ में कन्स्ट्रक्टर हमेशा बेस क्लास सूची (आधार 2 के आधार पर आधार 1) में दिखाए गए क्रम में आधार वर्गों का निर्माण करता है, फिर यह वर्ग परिभाषा में शीर्ष से नीचे सदस्य चर को बनाता है। यह आपके सदस्य प्रारंभिक सूची में चीजों को निर्दिष्ट करने के क्रम के बिना करता है - इस आदेश को अनदेखा किया जाता है, लेकिन यदि यह कुछ कंपाइलर्स से मेल नहीं खाता है (आपके जैसा लगता है) आपको इसके बारे में चेतावनी देगा।

कारण यह है कि सी ++ में सख्त आवश्यकता है कि विनाशकों को रचनाकारों के विपरीत क्रम में बुलाया जाए, इसलिए यदि सदस्य प्रारंभिक सूचियों के क्रम में चीजें करते हैं तो इसे किसी भी तरह याद रखना होगा "किस कन्स्ट्रक्टर को बुलाया गया था ताकि वह विनाशकों को सही क्रम में बुला सके। यह ऐसा नहीं करता है, बल्कि इसके बजाय हमेशा एक ही क्रम का उपयोग करता है।

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