2012-01-17 23 views
5

में थोड़ा फ़ील्ड कैसे प्रारंभ करें परिभाषित मानों के लिए आप किसी संरचना में निम्न संरचना के मानों को कैसे प्रारंभ करते हैं?एक कन्स्ट्रक्टर

दोनों विकल्पों मेरी कोड उदाहरण में दिखाया गया एक सा बदसूरत होने लगते हैं ....

struct T_AnlagenInfo01 
{ 
    // Option A 
    T_AnlagenInfo01() : fReserve80_0(0), fReserve80_1(0),.... {}; 

    // Option B 
    T_AnlagenInfo01() 
    { 
     memset(this, 0, sizeof(T_AnlagenInfo01)); 
    } 

    unsigned long fReserve80_0       : 1;   
    unsigned long fReserve80_1       : 1;   
    unsigned long fReserve80_2       : 1;   
    unsigned long fReserve80_3       : 1;   
    unsigned long fReserve80_4       : 1; 
    unsigned long fReserve80_5       : 1; 
    unsigned long fReserve80_6       : 1; 
    unsigned long fReserve80_7       : 1; 

    unsigned long fReserve81_0       : 1;  // 81 
    unsigned long fReserve81_1       : 1;   
    unsigned long fReserve81_2       : 1;   
    unsigned long fReserve81_3       : 1; 
    unsigned long fReserve81_4       : 1; 
    unsigned long fReserve81_5       : 1; 
    unsigned long fReserve81_6       : 1; 
    unsigned long fReserve81_7       : 1; 
}; 
+0

कक्षा में वर्चुअल फ़ंक्शंस होने पर 'मेमसेट' विकल्प से सावधान रहें, क्योंकि यह Vtable को ओवरराइट कर देगा। –

+0

भयानक नामकरण सम्मेलन। विरासत, मुझे लगता है? वैसे भी, 'fReserve80_0 (0) 'मानक तरीका है, और वास्तव में कम बदसूरत और अधिक रखरखाव और memset से टाइपएफ़ है। –

+0

@phresnel: Ooooh yes ... :-(विरासत कोड जो एक नई तेज मशीन पर उपयोग करते समय काम करना बंद कर दिया। –

उत्तर

3

एक स्पष्ट समाधान एक अलग संरचना है, जो आपके संरचना का एक सदस्य है में बिट्स के सभी डाल करने के लिए होगा, और नकल एक स्थिर सदस्य से प्रारंभ कि , जैसे:

struct T_AnlagenInfo01 
{ 
    struct Bits 
    { 
     unsigned long fReserve80_0 : 1; 
     unsigned long fReserve80_1 : 1; 
     // ... 
    }; 
    Bits myBits; 
    static Bits initialBits; 

    T_AnlagenInfo01 : myBits(initialBits) {} 
}; 

T_AnlagenInfo01::Bits T_AnlagenInfo01::initialBits = {}; 

यह होगा यहां तक ​​कि कुछ बिट्स को 0.

2

मुझे लगता है कि Option A है कि बुरा नहीं है। यदि आप प्रत्येक बिट के लिए अलग नामित चर होने की परेशानी से सहमत हैं, तो उन्हें अलग से शुरू करने के लिए बहुत दयालु रहें। Option B एक गंदे हैक की तरह लगता है और तकनीकी रूप से अपरिभाषित व्यवहार भी हो सकता है (हालांकि मुझे पूरी तरह से यकीन नहीं है)। किसी भी मामले में, माफ की तुलना में बेहतर सुरक्षित। इसके बारे में सोचने के लिए आओ, एक मोटा मौका है कि यह वास्तव में यूबी है क्योंकि आपका प्रकार POD नहीं है।

कृपया ध्यान दें कि मेरा उत्तर तब होता है जब आप प्रत्येक बिट के लिए अलग-अलग नाम बदलना चाहते हैं। इन सभी बिट-फ़ील्ड के बजाय आपके पास हमेशा std::vector<bool> या std::bitset<N> या boost::dynamic_bitset सदस्य हो सकते हैं।

0

विकल्प सी

struct T_AnlagenInfo01 
{ 
    bitset<14> mybits; 
} 

आप थोड़ा क्षेत्रों के बजाय bitset उपयोग कर सकते हैं और आप कुछ भी प्रारंभ के लिए विशेष करने की है, तो आप उन सभी को सेट किए बिना चाहते हैं नहीं है। और 14 सदस्यों के साथ एक वर्ग के बजाय आप एक ही काम करने के लिए सदस्य कार्य प्रदान कर सकते हैं।

+0

क्षमा करें, मुझे डेटा संरचना रखना है। तो मेरे लिए कोई बिटसेट नहीं है .... –

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