2009-11-28 13 views
5

है, मैं गेम के लिए टाइल मैप बनाने के लिए सी ++ का उपयोग कर रहा हूं। मेरी समस्या यह है कि, मैं मानचित्र निर्माता में इन्ट्स की एक बहुआयामी सरणी को पॉप्युलेट करना चाहता हूं, लेकिन यह ठीक से काम नहीं कर रहा है। "Map.h" में मेरा कोड यहां है (अप्रासंगिक कोड हटा दिया गया है)।जनरेटिंग int सरणी जो सदस्य चर

class Map { 

private:  
int mapArray[15][20]; 

}; 

और Map.cpp

Map::Map() 
{ 

    mapArray = { 
     { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 }, 
     { 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39 }, 
     { 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59 }, 
     { 60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 }, 
     { 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99 }, 
     { 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119 }, 
     { 120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139 }, 
     { 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159 }, 
     { 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179 }, 
     { 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 }, 
     { 200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219 }, 
     { 220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239 }, 
     { 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259 }, 
     { 260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279 }, 
     { 280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299 } 
    }; 


} 

पी एस से मेरी कोड। नक्शा बनाना स्थानीय रूप से, int mapArray [15] [20] का उपयोग करके एक सदस्य फ़ंक्शन के भीतर और इसे पॉप्युलेट करना ठीक काम कर रहा है, मैं इसे सदस्य चर के साथ कन्स्ट्रक्टर में पॉप्युलेट करने के लिए प्रतीत नहीं कर सकता।

पीपीएस। सी ++ के साथ बहुत जंगली, कृपया नम्र हो।

मैं क्या गलत कर रहा हूं?

धन्यवाद, जेम्स।

+0

यदि आप ऑब्जेक्ट से ऑब्जेक्ट में सरणी मानों को बदलने नहीं जा रहे हैं, तो आपको वास्तव में एक * स्थिर * सदस्य सरणी चाहिए। मैड्स द्वारा जवाब देखें। – AnT

+0

यदि वे सभी अनुक्रमिक संख्याएं हैं, तो बस एक लूप लिखना आसान हो सकता है (एक दो-आयामी सरणी स्मृति में संगत है, इसलिए आपको नेस्टेड लूप की भी आवश्यकता नहीं है)। (यदि ये मान बदलने नहीं जा रहे हैं, तो उन्हें देखने के लिए उन्हें गणना करना सस्ता हो सकता है।) – UncleBens

+0

वे हमेशा अनुक्रमिक नहीं होंगे। वे सिर्फ परीक्षण मूल्य हैं। –

उत्तर

6

आप क्लास कन्स्ट्रक्टर में सरणी प्रारंभकर्ताओं का उपयोग नहीं कर सकते हैं। सदस्यों को केवल प्रारंभकर्ता सूची का उपयोग करके प्रारंभ किया जा सकता है। आपकी सबसे अच्छी शर्त फ़ाइल से इस डेटा को लोड करना है, या सरणी को स्थैतिक घोषित करना है।

class Map 
{ 
private: 
static int mapArray[15][20]; 
/* ... */ 
}; 

फिर एक स्रोत फ़ाइल (सीपीपी) में स्थिर सरणी के लिए भंडारण परिभाषित करते हैं, यह भी एक अनुवाद इकाई के रूप में जाना जाता है:

int Map::mapArray[15][20] = { ... }; 
+0

धन्यवाद मैड्स, अभी के लिए मैं सरणी स्थिर बना दूंगा और जब मैं आगे बढ़ता हूं तो इसे फ़ाइल से लोड करने में लग रहा हूं। आपकी मदद के लिए धन्यवाद: डी –

2

आप केवल शुरुआत के लिए ब्रेस वाक्यविन्यास का उपयोग कर सकते हैं।

जब आपका कन्स्ट्रक्टर निष्पादित किया जाता है, तो सरणी सदस्य का निर्माण किया गया है।

0

यदि आप घोषणा में सरणी शुरू कर रहे हैं तो आप केवल घुंघराले ब्रेस वाक्यविन्यास का उपयोग कर सकते हैं। आपके कन्स्ट्रक्टर में, आप नहीं हैं। आप हार्ड कोडिंग के बजाए किसी भी फाइल से मैप डेटा लोड करना चाहते हैं।

5

आप इस तरह कुछ करने के लिए सक्षम होना चाहिए:

class Map 
{ 
    int mapArray[15][20]; 

    public: 
    Map() : mapArray((int[15][20]) { 
    { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 }, 
    { 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39 }, 
    { 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59 }, 
    { 60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 }, 
    { 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99 }, 
    { 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119 }, 
    { 120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139 }, 
    { 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159 }, 
    { 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179 }, 
    { 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 }, 
    { 200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219 }, 
    { 220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239 }, 
    { 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259 }, 
    { 260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279 }, 
    { 280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299 } 
    }) 
    { 
    } 
}; 

ध्यान दें कि यह प्रारंभिक शैली सी 99 का हिस्सा है और इसे आपके कंपाइलर के साथ शामिल नहीं किया जा सकता है या सी ++ के लिए काम नहीं कर सकता है। मेरे लिए जीसीसी 4 पर काम करता है।

यह भी ध्यान दें कि मैंने इस कोड को संकलित नहीं किया है। मैंने इसे अपने मामले के लिए किसी अन्य कोड से अनुकूलित किया जो काम करता है।

+1

भगवान, यह भयानक है। लेकिन फिर भी सही और उपयोगी। +1 –

+0

क्या यह पहले से ही तय किया गया है कि यौगिक अक्षर इसे C++ 0x में बनाते हैं? पिछली बार मैंने जांच की थी कि कंप्यूंड अक्षर को सी ++ 0x द्वारा अस्वीकार कर दिया गया था (हालांकि मैं नवीनतम घटनाओं पर पीछे हो सकता हूं) – AnT

+0

मैंने इस वाक्यविन्यास का उपयोग कई वर्षों से किया है और आईडीई को बग रिपोर्ट दायर करने की भी हिम्मत की है जो इसे पहचान नहीं पाए। अब तक सभी ने इसे ठीक कर दिया है ;-) – hirschhornsalz

1

दुर्भाग्यवश, सदस्य गैर-स्थैतिक सरणी के लिए सी ++ में ऐसा करने के लिए कोई वाक्यविन्यास नहीं है। आप प्रारंभिक मानों को सरणी सदस्यों को एक-एक करके असाइन कर सकते हैं, लेकिन, ज़ाहिर है, यह काफी बोझिल है।

यदि उस वर्ग की सभी ऑब्जेक्ट्स में सरणी मान समान हैं, तो आपको शायद static सदस्य सरणी की आवश्यकता है। तब मैड्स से जवाब देखें।

यदि आपको वास्तव में एक गैर स्थैतिक सदस्य सरणी की आवश्यकता है, जिसका अर्थ है कि आप प्रति-ऑब्जेक्ट आधार पर सरणी की सामग्री को बाद में संशोधित करके या इसे अलग-अलग करके "कस्टमाइज़" करने में सक्षम होना चाहते हैं, तो आप कोशिश कर सकते हैं इस

class Map { 
    static const int MapArrayInit[15][20]; 
    int MapArray[15][20]; 

public: 
    Map() 
    { 
    assert(sizeof MapArray == sizeof MapArrayInit); // better: STATIC_ASSERT 
    std::memcpy(MapArray, MapArrayInit, sizeof MapArray); 
    // Now you can customize MapArray to your liking 
    } 
}; 

और कार्यान्वयन फ़ाइलों

const int Map::MapArrayInit = { /* whatever */ }; 

में से एक में यह आवश्यकता होगी MapArrayInit के लिए अतिरिक्त स्मृति कर रही है, लेकिन जब से तुमके प्रत्येक उदाहरण में एक अलग MapArray instatiating कर रहे हैंवैसे भी यह एक बड़ा सौदा नहीं है।

आप प्रारंभ करने के बाद अपने MapArray संशोधित करने के लिए नहीं करना चाहते हैं, लेकिन अभी भी `मानचित्र के विभिन्न मामलों में MapArray सामग्री के कई अलग अलग संस्करणों करना चाहते हैं ', तो आपको निम्न दृष्टिकोण

class Map { 
    static const int MapArrayInit1[15][20]; 
    static const int MapArrayInit2[15][20]; 
    static const int MapArrayInit3[15][20]; 
    const int (&MapArray)[15][20]; // or a pointer 

public: 
    Map() : MapArray(MapArrayInit1) /* or 2, or 3 */ 
    { 
    } 
}; 

और में उपयोग कर सकते हैं कार्यान्वयन फाइलों में से एक

const int Map::MapArrayInit1 = { /* whatever */ }; 
const int Map::MapArrayInit2 = { /* whatever */ }; 
const int Map::MapArrayInit3 = { /* whatever */ }; 

चुनें जो भी आपके लिए सबसे अच्छा काम करता है।

0

यह एक असाइनमेंट है, प्रारंभिक नहीं। सरल ब्रेस प्रारंभकर्ता केवल प्रारंभिकरण के दौरान काम करते हैं। यौगिक शाब्दिक वाक्यविन्यास का उपयोग करें, जो एक टाइपकास्ट जैसा दिखता है (जिसे आप प्रारंभ करना चाहते हैं) के बाद एक ब्रेस प्रारंभकर्ता के बाद।

Map::Map() 
{ 

    mapArray = (int[15][20]) { 
     { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 }, 
     { 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39 }, 
     { 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59 }, 
     { 60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 }, 
     { 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99 }, 
     { 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119 }, 
     { 120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139 }, 
     { 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159 }, 
     { 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179 }, 
     { 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 }, 
     { 200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219 }, 
     { 220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239 }, 
     { 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259 }, 
     { 260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279 }, 
     { 280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299 } 
    };  
} 
संबंधित मुद्दे