2013-05-17 11 views
5

मैं शतरंज गेम प्रोग्राम करने के लिए सी ++ का उपयोग कर रहा हूं। मैं कक्षा बोर्ड के लिए दो वर्ग विशेषताओं को बनाना चाहता हूं: पंक्तियां और कॉलमन्स। जावा में, मैं उन्हें स्थिर अंतिम घोषित करता हूं और जैसा कि मैं चाहता हूं सबकुछ काम करेगा। मैं सी ++ में एक ही घोषणा कैसे करता हूं? मुझे अन्य वर्गों में "बोर्ड :: ROWS" और "बोर्ड :: COLUMNS" द्वारा इन विशेषताओं तक पहुंचने की आवश्यकता है।सी ++ जावा स्थिर अंतिम समतुल्य

मेरे पास यह क्या है, जो संकलन त्रुटियों को फेंक रहा है क्योंकि ROWS और COLUMNS को m_TileMap की घोषणा के दायरे में घोषित नहीं किया गया है। #define कथन का उपयोग किए बिना ऐसा करने के लिए कोई अच्छा अभ्यास है?

class Board { 
    Tile *m_TileMap[ROWS][COLUMNS]; 

public: 
    static const int ROWS = 8; 
    static const int COLUMNS = 8; 

    Board(int m[ROWS][COLUMNS]); 
} 
+0

मैं इसके बजाय std :: vector का उपयोग करने का सुझाव देता हूं! –

उत्तर

2

पंक्तियों और स्तंभों

की घोषणा के बाद अपने m_TileMap की घोषणा जैसे

class Board { 

public: 
    static const int ROWS = 8; 
    static const int COLUMNS = 8; 

    Board(int m[ROWS][COLUMNS]); 

private: 
    Tile *m_TileMap[ROWS][COLUMNS]; 
}; 

इसका कारण यह है क्योंकि सी ++ में, कंपाइलर आगे नहीं पढ़ता है। इसलिए जब आप m_TileMap घोषित करते हैं तो संकलक द्वारा ROWS और COLUMNS को समझने के लिए, उन्हें पहले घोषित करने की आवश्यकता है।

+0

स्पष्टीकरण के लिए धन्यवाद, यह समझ में आता है। –

1

आप पुनः क्रमित कर सकते वर्ग के सदस्यों, ताकि पंक्तियों और स्तंभों इससे पहले कि वे इस्तेमाल कर रहे हैं की घोषणा की जाती:

class Board { 
public: 
    static const int ROWS = 8; 
    static const int COLUMNS = 8; 

    Board(int m[ROWS][COLUMNS]); 

private: 
    Tile *m_TileMap[ROWS][COLUMNS]; 
}; 
+0

धन्यवाद! यह काम किया ... –

+0

@ लुकास क्रेउत्ज़ - आपका स्वागत है। और StackOverflow में आपका स्वागत है। आप अपने बाईं ओर अप-त्रिकोण पर क्लिक करके उपयोगी उत्तर प्राप्त कर सकते हैं। (यह आपके लिए सबसे उपयोगी उत्तर को चेक-मार्क करने के अतिरिक्त उपलब्ध है।) –

0

आपको कक्षा परिभाषा में आकार देने की आवश्यकता है: स्थिर कॉन्स int ROWS = 8; आदि

और इसे न भूलें; कक्षा परिभाषा के बाद! जब m_TileMap के लिए परिभाषा पार्स किया गया है

1

class Board { 
public: 
    enum {ROWS = 8}; 
    enum {COLUMNS = 8}; 

private: 
    Tile *m_TileMap[ROWS][COLUMNS]; 

public: 
    Board(int m[ROWS][COLUMNS]); 
}; 
1

ROWS और COLUMNS निम्नलिखित के रूप में की कोशिश उपयोग enums अभी तक घोषित नहीं किया गया है। सीधे शब्दों में उन परिभाषाओं के लिए कदम:, एक तरफ

class Board { 
    Tile *m_TileMap[ROWS][COLUMNS]; 

public: 
    static const int ROWS = 8; 
    static const int COLUMNS = 8; 

    Board(int m[ROWS][COLUMNS]); 
}; 

एक के रूप में अगर तुम कभी ROWS या COLUMNS का पता लेने की जरूरत नहीं है, एक विकल्प के इस तरह एक enum उपयोग करने के लिए, होगा:

class Board { 
public: 
    enum { ROWS = 8, COLUMNS = 8}; 
    Tile *m_TileMap[ROWS][COLUMNS]; 


    Board(int m[ROWS][COLUMNS]); 
}; 

यह सब कहा जा रहा है, अगर आप vector का उपयोग करते हैं तो जीवन इतना आसान नहीं होगा?

+0

स्पष्टीकरण के लिए धन्यवाद। मैं एक enum का उपयोग करेंगे, मुझे लगता है कि यह बहुत बेहतर है। मैंने एक सरणी का उपयोग किया क्योंकि मुझे लगता है कि एक मिनीमैक्स एल्गोरिदम के साथ उपयोग करना आसान होगा। –

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