2009-12-28 11 views
6
#define ROW 3 
#define COL 4 

class Matrix 
{ 
    private: 
     int mat[ROW][COL]; 
    //..... 
    //..... 

}; 

int main() 
{ 
    Matrix m; 
    int a = m[0][1]; // reading 
    m[0][2] = m[1][1]; // writing 
} 

मुझे लगता है कि सीधे अधिभार करना संभव नहीं है [] []।2 डी सरणी के रैपर वर्ग के लिए सरणी अनुक्रमणिका ऑपरेटर को अधिभार कैसे करें?

मुझे लगता है कि मुझे इसे अप्रत्यक्ष रूप से करना है लेकिन इसे कैसे कार्यान्वित करना है?

उत्तर

10

ऑपरेटर() का उपयोग करना आसान समाधान है क्योंकि यह एकाधिक पैरामीटर की अनुमति देता है।

class M 
{ 
    public: 
     int& operator()(int x,int y) {return at(x,y);} 
    // .. Stuff to hold data and implement at() 
}; 


M a; 
a(1,2) = 4; 

आसान तरीका है कि पहले ऑपरेटर [] एक मध्यवर्ती उद्देश्य यह है कि दूसरे ऑपरेटर [] सरणी से मान देता है देता है।

class M 
{ 
    public: 
    class R 
    { 
     private: 
      friend class M; // Only M can create these objects. 
      R(M& parent,int row): m_parent(parent),m_row(row) {} 
     public: 
       int& operator[](int col) {return m_parent.at(m_row,col);} 
     private: 
       M& m_parent; 
       int m_row; 
    }; 

    R operator[](int row) {return R(*this,row);} 

    // .. Stuff to hold data and implement at() 
}; 

M b; 
b[1][2] = 3; // This is shorthand for: 

R row = b[1]; 
int& val = row[2]; 
val  = 3; 
+0

क्या एक अच्छा अनुकूलक प्रॉक्सी संस्करण को 'ऑपरेटर()' के रूप में कुशल कोड में बदल देगा? – GManNickG

+0

यह संकलक पर निर्भर करता है। लेकिन मैं अपनी वस्तुओं का उपयोग सहज के रूप में सहज बनाने के लिए करना चाहता हूं। ऑब्जेक्ट का उपयोग करने के लिए जितना स्वाभाविक लगता है उतना ही गलतियों के लिए ऑपरेशन की संभावना कम होती है। मैं व्यक्तिगत रूप से प्रॉक्सी पसंद करता हूं लेकिन इस स्थिति के लिए इसके छः दर्जन दर्जनों में से छह और मैं निश्चित रूप से यह नहीं कह सकता कि एक दूसरे से बेहतर है। –

+0

हाँ, मैंने हमेशा 'ऑपरेटर() 'का उपयोग किया है, लेकिन मुझे लगता है कि मैं इस बार प्रॉक्सी का उपयोग करूंगा (मैं गेम इंजन लिखता हूं) और देखता हूं कि यह कोई समस्या पैदा करता है या नहीं। मैं कल्पना नहीं कर सकता कि संकलक के लिए इसे जितना तेज़ बनाना मुश्किल होगा, क्योंकि इसमें सभी ऑपरेटरों की पूर्ण परिभाषा होगी। – GManNickG

1

जब से तुम निश्चित-आकार सरणियों में अपने तत्वों को स्टोर करने के लिए यह काफी आसान हो जाएगा चाहते हैं:

#define ROWS 3 
#define COLS 4 

typedef int row_type[COLS]; 

class matrix { 
    row_type elements[ROWS]; 
public: 
    ... 
    row_type const& operator[](int r) const {return elements[r];} 
    row_type  & operator[](int r)  {return elements[r];} 
    ... 
}; 

यही काम करना चाहिए।

इसके अलावा, आप #define एस को उचित स्थिरांक के साथ प्रतिस्थापित करना चाहते हैं या अपने मैट्रिक्स वर्ग को अधिक सामान्य बनाने के लिए प्रकार (int) और आकार (3x4) के लिए टेम्पलेट पैरामीटर का उपयोग करना चाह सकते हैं। यदि आप गतिशील आकारों का समर्थन करना चाहते हैं तो आपके ऑपरेटर [] को प्रॉक्सी-ऑब्जेक्ट्स लौटने की आवश्यकता है। यह संभव है लेकिन आपको शायद तत्व एक्सेस के लिए दो इंडेक्स पैरामीटर के साथ ऑपरेटर() पसंद करना चाहिए।

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