2012-08-06 14 views
18

मैं एक स्थिति है जिसमें निम्नलिखित में संक्षेप किया जा सकता है मिल गया है में एक निरंतर आकार सरणी प्रारंभ?एक प्रारंभकर्ता सूची

Test::Test() : MySet({1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) {} 

वहाँ एक वर्ग के initalizer सूची में एक निरंतर आकार सदस्य सरणी प्रारंभ करने में कोई तरीका है:

प्रारंभकर्ता सूची इस तरह की तरह

?

+3

द्वारा समर्थित हैं उपयोग करते हैं, 'Set' एक करने के लिए सिर्फ एक सूचक नहीं है '10' पूर्णांक की सरणी, न ही यह 'स्थिर' है। इसके बजाय, सरणी नाम 'सेट' कुछ स्थितियों में सरणी के पहले तत्व को पॉइंटर को क्षय करता है। अंतर 'आकार' का उपयोग करके स्पष्ट रूप से देखा जा सकता है - यानी 'आकार (सेट) == 10 * आकार (int)! = Sizeof (int *) '। स्पष्टीकरण के लिए –

+1

@StuartGolodetz धन्यवाद। जब मैंने स्थैतिक कहा, तो मेरा मतलब इस रूप में स्थिर था कि यह ऑब्जेक्ट/इंस्टेंस के साथ संग्रहीत है, और ढेर में कहीं और नहीं। बेशक, यह मेरे हिस्से पर 'स्थैतिक' शब्द का एक बड़ा दुरुपयोग है; माफ़ कीजिये। – Serge

+0

कोई चिंता नहीं :) मैं मुख्य रूप से ऑफ-पॉइंटर्स के बीच भेद को स्पष्ट करने की कोशिश कर रहा था कि वहां एक गलतफहमी हो सकती है। –

उत्तर

21

है। सी ++ 11 मानक के अनुरूप एक कंपाइलर का उपयोग करते हुए आप वास्तव में ऐसा कर सकते हैं।

struct Test { 
    Test() : set { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } { }; 
    int set[10]; 
}; 

उपर्युक्त कोड g++ -std=c++0x -c test.cc का उपयोग कर ठीक से संकलित करता है।


के रूप में टिप्पणी में एक उपयोगी उपयोगकर्ता द्वारा मुझे नीचे कहे अनुसार, इस कोड माइक्रोसॉफ्ट के कुलपति ++ संकलक सीएल का उपयोग कर, संकलन नहीं है। शायद कोई मुझे बता सकता है कि समकक्ष std::array का उपयोग करेगा?

#include <array> 

struct Test { 
    Test() : set { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } } { }; 
    std::array<int, 10> set; 
}; 

यह भी g++ -std=c++0x -c test.cc का उपयोग कर ठीक संकलित करता है।

+2

सी ++ 11 (या इसके कुछ हिस्सों) को प्यार करने का एक और अच्छा कारण! = डी बहुत बहुत धन्यवाद! – Serge

+0

@ सर्ज कोई समस्या नहीं! – oldrinb

+5

ध्यान दें कि यह कोड विजुअल सी ++ संस्करण 11 और इससे पहले संकलित नहीं है (यानी, यह माइक्रोसॉफ्ट विजुअल स्टूडियो 2012 के साथ संकलित नहीं है, और विजुअल सी ++ सबसे आम मंच के लिए मुख्य संकलक है)। तो, ** यदि आप पोर्टेबल कोड चाहते हैं, तो यह मत करें **। फिर भी। –

4

दुर्भाग्य से, सी ++ 03 में, आप प्रारंभकर्ता सूचियों में सरणी प्रारंभ नहीं कर सकते हैं। आप कर सकते हैं में सी ++ 11 ही आपके संकलक नए :)

देखने है यदि: सी ++ 03, सी ++ 11 द्वारा प्रस्तुत विस्तारित प्रारंभकर्ता सूचियों में उपलब्ध नहीं How do I initialize a member array with an initializer_list?

+1

यहां तक ​​कि सी ++ 98 प्रारंभिक सूचियों में सरणी के शून्य-प्रारंभिक समर्थन का समर्थन करता है। –

3

"मैं समझता हूँ कि सेट सिर्फ 10 पूर्णांकों का स्थिर सरणी के लिए सूचक है"

नहीं, यह गलत है: यह एक सरणी, नहीं एक सूचक है।

आप अभी भी इसे निर्माता की प्रारंभिक सूची में प्रारंभ कर सकते हैं।

एक संकलक कि सी ++ 11 घुंघराले ब्रेसिज़ प्रारंभ (विजुअल C++ संस्करण 11 और पहले मन में आता है) के रूप में नीचे दिखाया गया है आप, हालांकि कुछ हुप्स के माध्यम से कूद करना होगा समर्थन नहीं करता है के लिए:

#include <iostream> 
#include <vector> 
using namespace std; 

#define CPP11 
#if defined(_MSC_VER) 
# if (_MSC_VER <= 1700) 
#  undef CPP11 
# endif 
#endif 

#ifdef CPP11 
class Cpp11 
{ 
private: 
    int set_[10]; 

public: 
    Cpp11() 
     : set_{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } 
    {} 

    int foo() const { return set_[3]; } 
}; 
#endif 

class Cpp03 
{ 
private: 
    struct IntArray10 { int values[10]; }; 
    IntArray10 set_; 

    static IntArray10 const& oneToTen() 
    { 
     static IntArray10 const values = 
      { {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} }; 
     return values; 
    } 

public: 
    Cpp03() 
     : set_(oneToTen()) 
    {} 

    int foo() const { return set_.values[3]; } 
}; 

int main() 
{} 

कच्चे सरणियों उपयोग करने के बजाय, हालांकि, std::vector और 11 std::array सी +++, जो दोनों के लिए क्या यह लायक है के लिए भी विजुअल C++ 11.

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