डी

2012-02-12 10 views
7

में सरणी के साथ रचनाकारों का उपयोग करना आप नए के साथ सरणी आवंटित करते समय कन्स्ट्रक्टर को कैसे कॉल करते हैं?डी

उदाहरण के लिए, निम्नलिखित कोड में मैं ए के प्रत्येक तत्कालता के लिए कन्स्ट्रक्टर को कैसे कॉल करूं, सभी 10 तत्वों के लिए बी से 5 शुरू करना?

void main() { 
    A[] a = new A[10]; 
} 

class A { 
    int b; 
    this(int init) { 
     b = init; 
    } 
} 

मेरा अनुमान है कि यह संभव नहीं है, लेकिन मुझे उम्मीद है कि कर सकते हैं ...

उत्तर

11

एक सरल पाश करना चाहिए (और यह सबसे पठनीय है)

foreach(ref el;a){ 
    el=new A(5); 
} 

या आप उपयोग कर सकते हैं सरणी प्रारंभकर्ता:

A[] a=[new A(5),new A(5),new A(5),new A(5),new A(5), 
     new A(5),new A(5),new A(5),new A(5),new A(5)]; 
4

यदि आप किसी मान प्रकार से निपट रहे हैं, तो आप std.array.replicate का उपयोग कर सकते हैं।

auto a = replicate([5], 50); 

लंबाई 50 के int[] बनाना चाहेंगे जहां प्रत्येक तत्व एक संदर्भ प्रकार के साथ भी ऐसा ही कर सकते हैं 5. है आप , लेकिन सभी तत्वों का एक ही वस्तु का उल्लेख करने जा रहे हैं।

auto a = replicate([new A(5)], 50); 

केवल A के निर्माता एक बार फोन होगा, और आप एक A[] जहां सभी तत्वों का एक ही वस्तु का उल्लेख के साथ खत्म हो जाएगा। आप उन्हें अलग वस्तुओं का उल्लेख करना चाहते हैं, तो आप या तो प्रत्येक तत्व को अलग-अलग

auto a = new A[](50); 
foreach(ref e; a) 
    e = new A(5); 

सेट या एक शाब्दिक

auto a = [new A(5), new A(5), new A(5)]; 

साथ पूरे सरणी प्रारंभ करने में करने जा रहे हैं लेकिन वह स्पष्ट रूप से केवल काम करेगा अपेक्षाकृत छोटे सरणी के लिए।

1

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

template allocate(T) { 
    T[] allocate(int size, int arg) { 
     T[] result = new T[size]; 
     foreach(ref el; result) 
      el=new T(arg); 
     return result; 
    } 
} 

तो फिर तुम साथ एक बार में 10 तत्वों की एक पूरी सरणी आवंटित कर सकते हैं:

A[] a = allocate!(A)(10, 5); 

बेशक यह निर्माता तर्क तय किया है की, लेकिन आप शायद टेम्पलेट और कुछ करने के लिए variadic तर्क के साथ कुछ कर सकते हैं सही कन्स्ट्रक्टर कॉल उत्पन्न करने के लिए mixins।