2011-02-16 14 views
6

को टाइप एक struct में, आकृति मैं एक समारोह है:संलग्न नहीं कर सकते निरंतर (struct) सरणी

... 
import graphics.line; 

struct Shape { 
    Line[] lines; 

    void addLine(Line l) { 
     lines ~= l; 
    } 
} 

लाइन भी एक struct है, लेकिन जब मैं "in Line l" addLine() के लिए डाल तर्क घोषणा के रूप में, संकलक के साथ कीड़े बाहर:

shape.d(12): Error: cannot append type const(Line) to type Line[]

अजीब बात मैं एक और मॉड्यूल में कोड की एक ऐसी ही टुकड़ा है, और यह काम करता है ... तो मेरे सवाल है, क्यों संकलक इस मामले में यह के साथ खुश नहीं है ?

उत्तर

12

असल में, क्या यह काम इस बात पर निर्भर करता है कि आपकी संरचना के सदस्यों के पास क्या है। in स्टोरेज क्लास const scope के बराबर है। तो, void addLine(in Line l) लिखने का अर्थ है कि l const है। और चूंकि const संक्रमणीय है, सभी Line l संरचना सदस्य const भी हैं।

Shape सदस्य Line[] lines हालांकि const नहीं है। तो, आप const Line l को const पर कुछ ऐसा करने की कोशिश कर रहे हैं। चाहे यह संभव है struct Line l के सभी सदस्यों के प्रकारों पर निर्भर करता है। यदि सभी line के सदस्यों के पास मूल्य (प्रति) अर्थशास्त्र है, यह संलग्न (जो असाइनमेंट है) संभव है। यदि किसी एक सदस्य के पास (कुछ) संदर्भ अर्थशास्त्र (उदा। एक सूचक की प्रतिलिपि बनाई जाती है), यह संलग्न अब और संभव नहीं है। अन्यथा, आप const Line lcaddLines में दे सकते हैं, लेकिन lines के गैर-कॉन्स सदस्य प्राप्त करेंगे। इस माध्यम से, आप भी संदर्भ अर्थ विज्ञान के साथ मूल्य को बदल सकता है, परोक्ष रूप से मूल lc की, मान परिवर्तित, जिससे const गारंटी, डी में

उदाहरण const की अर्थात् संक्रामिता का उल्लंघन:

class C { } 

struct Line { 
    int i; 
    // int* p;    // if you uncomment this, addLine fails 
    // C c;     // if you uncomment this, addLine fails 
} 

struct Shape { 
    Line[] lines; 
    void addLine(in Line l) { lines ~= l; } 
} 

void main() { } 

संपादित करें: बीटीडब्ल्यू, इसे काम करने का एक और तरीका Line[] lines; से const(Line)[] lines; को बदलना है। सरणी से केवल const तत्व होते हैं, और addLine में const l को जोड़ना संभव है।

+0

Thx, बहुत अच्छी तरह से समझाया गया! – Trass3r

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