2013-03-24 8 views
5

मेरे पास एक मैट्रिक्स क्लास है, जो तत्वों तक पहुंचने के लिए [] [] का उपयोग करती है। जब एक (या दोनों) इंडेक्स सीमा से बाहर होते हैं, तो मुझे CIndexException फेंकना पड़ता है। यह एक वर्ग है जो इस प्रारूप में पाठ संग्रहीत करता है "अमान्य अनुक्रमणिका [ए] [बी]", जहां ए और बी संख्याएं हैं।सरणी सीमा से बाहर होने पर अपवाद फेंक रहा है

यह मेरा CIndexException वर्ग

class CIndexException 
{ 
    string text; 
public: 
    CIndexException (int a, int b) 
    { 
     ostringstream oss; 
     oss << "Invalid index ["; 
     oss << a; 
     oss << "]["; 
     oss << b; 
     oss < "]"; 

     text = oss.str(); 
    } 

    string get() const 
    { 
     return text; 
    } 
}; 

मैट्रिक्स युगल के एक 2D सरणी के रूप में प्रस्तुत किया जाता है की वर्तमान कार्यान्वयन, यह निर्माता में आरंभ नहीं हो जाता है:

CMatrix(int r, int c) 
{ 
    colls = c; 
    rows = r; 
    mat = new double * [rows]; 

    for (int i = 0; i < rows; i++) 
    { 
     mat[i] = new double [colls]; 
     for (int j = 0; j < colls; j++) 
      mat[i][j] = 0; 
    } 
} 

एक तत्व प्राप्त करने के लिए, मैं [अतिभारित ] ऑपरेटर इस तरह:

double * operator[] (int x) const 
{ 
    return mat[x]; 
} 

जब मैं एक [2] [3] टाइप करता हूं, तो यह फ़ंक्शन फिर से पहले हल करता है [], एक सरणी के लिए पॉइंटर लौटाता है और दूसरा [] सामान्य रूप से हल हो जाता है।

मैं आसानी से जांच सकता हूं कि पहली अनुक्रमणिका सीमा से बाहर है या नहीं, लेकिन मुझे दूसरी की जांच करने में परेशानी है। मैंने दूसरी कक्षा, मैट्रिक्सरो बनाने का विचार किया, जो मैट्रिक्स की एक पंक्ति का प्रतिनिधित्व करता है। तब मेरे पास MatrixRows की सरणी होगी। [] [] काम करने के लिए, उन दोनों वर्गों में ओवरलोडेड ऑपरेटर [] होगा। इस तरह से मैं दोनों इंडेक्स की जांच कर पाऊंगा, लेकिन मुझे नहीं पता कि उन्हें एक अपवाद में "शामिल" कैसे किया जाए। इस डिज़ाइन का उपयोग करते समय मैं अपवाद ऑब्जेक्ट में दोनों इंडेक्स की रिपोर्ट कैसे कर सकता हूं?

+1

आप पहले से ही अपने प्रश्न का उत्तर दे चुके हैं, आपको 'MatrixRow' क्लास बनाने की आवश्यकता है, उस पर' [] 'ऑपरेटर अधिभारित करें, और आप कर चुके हैं। समस्या क्या है? – antonijn

+4

मुझे कोई प्रश्न चिह्न नहीं दिख रहा है। – mfontanini

+0

@antonijn - समस्या यह है कि 'MatrixRow' वर्ग को अपवाद में उपयोग किए गए दोनों सूचकांकों की रिपोर्ट करने की आवश्यकता है, लेकिन आम तौर पर यह केवल कॉलम को ही जानता होगा। –

उत्तर

3

अपने MatrixRow समाधान के साथ जाएं, लेकिन प्रत्येक MatrixRow पर एक कन्स्ट्रक्टर तर्क के रूप में पंक्ति के सूचकांक को पास करें। MatrixRow उस नंबर को सहेज सकता है, और इसे उत्पन्न करता है किसी भी अपवाद संदेश में इसका उपयोग करें।

1

operator[]() के बजाय operator()() का उपयोग करें। यह link देखें। आपको इस लिंक पर जो कुछ चाहिए, उसे समझता है।

+0

यह सिर्फ बदसूरत है। वे matrices अनुक्रमण के लिए एक विशेष गैर-सी ++ वाक्यविन्यास का उपयोग करें। –

+0

'एम [i] [जे] 'कहता है:" हैलो 'एम (i, j)' आप बहुत बदसूरत हैं, लेकिन आप बहुत अच्छे काम करते हैं और आपका डिज़ाइन बहुत आसान है। क्यों? " – Narek

+0

वही एप्लिकेशन संभवतः 1 डी सरणी (वैक्टर) का भी उपयोग करेगा। क्या वे ऑपरेटर ओवरलोड भी करेंगे()? अब वे देशी सरणी और std :: वेक्टर से अलग हैं; भ्रम उत्पन्न होता है। –

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