2012-11-23 25 views
5

मैं समाधान const A a[3] = { {0,0}, {1,1}, {2,2} }, के बारे में पढ़ा है, लेकिन मेरे कार्यक्रम में const नहीं किया जा सकता:मैं कक्षा वस्तुओं की एक सरणी कैसे बना सकता हूं जिनके निर्माता को कुछ तर्क की आवश्यकता होती है?

class Paper: public PaperQueue{ 
    ... 
    protected: 
    typedef int (Utils::*funcPtr) (int, int); //I use external function there 
    funcPtr p;        
    Utils* fptr; 
    public: 
    int pricefunc(){  
     addprice = (fptr->*p) (t,price); 
    } 

    Paper(int n, unsigned int pr):PaperQueue(n){   
     ... 
     p=&Utils::commonpricefunc;  
    } 
    void Put(int a){ 
     ... 
    } 
    ... 
}  

class Bank{ 
    ... 
    void Buy(Paper &p){ 
    (/*this function modifies many parameters in 'p'*/) 
    ... 
    } 
    ... 
} 

int main(){ 
Bank B;  
int pn=5; 
/* ? */ const Paper p[pn] = {{5,15},{5,15},{5,15},{5,15},{5,15}}; /* ? */ 
int paperloop=0; 
... 
p[paperloop].Put(p[paperloop].addprice); 
B.Buy(p[paperloop]); 
... 

जो मुझे (त्रुटियों की एक बहुत pricefunc साथ देता है(), रखो(), खरीदें(), .. ।), या सिर्फ "चर-आकार वाली ऑब्जेक्ट 'पी' प्रारंभ नहीं किया जा सकता है"। क्या इस सरणी को काम करने का कोई तरीका है? (सब कुछ नहीं तो निर्माता के लिए किसी भी पैरामीटर प्रदान करने के ठीक काम करता है!)

+0

'** कॉन्स पेपर पी [पीएन]'? – iammilind

+0

मुझे 'पेपर (पी [पीएन]) (5,25)' या कुछ जैसे कुछ सरणी बनाने की आवश्यकता है ... प्रत्येक कन्स्ट्रक्टर को इन पैरामीटर प्राप्त करना चाहिए और 'पी [i] 'केवल पढ़ने योग्य वस्तु नहीं होनी चाहिए । – Slowpoke

+0

यह कोड के अंदर सिर्फ बोल्ड टैग था। – Slowpoke

उत्तर

2

आप कक्षाओं के लिए प्रारंभकर्ता सूचियों का उपयोग नहीं कर सकते हैं (गैर बताते हैं लगता है -PODs) क्योंकि यह कन्स्ट्रक्टर को कॉल को बाईपास करेगा। आपको इसे पीओडी में बदलना होगा या निम्न तरीकों से std :: vector का उपयोग करना होगा:

यदि वर्ग कॉपी करने योग्य है, जैसा कि प्रतीत होता है, तो आप एक std :: वेक्टर बना सकते हैं और इसे भर सकते हैं मूल्यों आप चाहते हैं:

const vector<Paper> papers(5, Paper(5, 15)); 

आप विभिन्न मूल्यों के साथ प्रारंभ करना चाहते हैं, तो आप एक प्रारंभकर्ता सूची का उपयोग कर सकते हैं, लेकिन यह केवल सी ++ 11 में समर्थित है:

const vector<Paper> papers = {Paper(1, 1), Paper(2, 2)}; 

सी ++ के बिना 11, आपको तत्वों को एक-एक करके जोड़ना होगा, लेकिन फिर आप वेक्टर कॉन्स नहीं बना सकते:

vector<Paper> papers; 
papers.push_back(Paper(1, 1)); 
papers.push_back(Paper(2, 2)); 
+0

धन्यवाद! 'int पीएन = 5; वेक्टर पी (पीएन, पेपर (5, 15)); 'यह किया। कम से कम कुछ। – Slowpoke

0

नीचे कोड की जांच करें, यह संकलित किया जा सकता:

class Paper{ 

सार्वजनिक:

int x; 
int y; 

};

पूर्णांक main() {

Paper p[5] = {{5,15},{5,15},{5,15},{5,15},{5,15}}; 

}

अधिक जानकारी के लिए this post देखें, मैं इसे बहुत अच्छी तरह से

+0

कोड g ++ 4.6.3 पर ठीक है, लेकिन मेरे प्रोग्राम में {5,15} पैरामीटर हैं जिन्हें मैं कन्स्ट्रक्टर को पास करने का प्रयास करता हूं। – Slowpoke

+0

ठीक है, धन्यवाद! जब मैंने पी लिखा [5] यह चेतावनी 'चेतावनी के साथ काम करना प्रतीत होता है: विस्तारित प्रारंभकर्ता सूचियां केवल -std = C++ 0x या -std = gnu ++ 0x' – Slowpoke

+0

के साथ उपलब्ध हैं क्या इसे सुंदर बनाने की कोई संभावना है? मैं कुछ पी [एन] की तरह कामना करना चाहता था ... – Slowpoke