2015-12-25 8 views
5

मेरे पास 2 डी सरणी है और मैं उस फ़ंक्शन को परिभाषित करना चाहता हूं जो इंडेक्स का मान देता है जो उपयोगकर्ता मुझे ऑपरेटर ओवरलोडिंग का उपयोग करता है। दूसरे शब्दों में:ऑपरेटर ओवरलोडिंग [] [] 2 डी सरणी सी ++

void MyMatrix::ReturnValue() 
{ 
    int row = 0, col = 0; 
    cout << "Return Value From the last Matrix" << endl; 
    cout << "----------------------------------" << endl; 
    cout << "Please Enter the index: [" << row << "][" << col << "] =" << ((*this).matrix)[row][col] << endl; 
} 

आपरेशन ((*this).matrix)[row][col] एक int लौटना चाहिए। मुझे नहीं पता कि operator [][] कैसे बनाया जाए।
वैकल्पिक रूप से, मैं operator [] पर कुछ कॉलों को जोड़ सकता था, लेकिन मैं इसमें सफल नहीं हुआ, क्योंकि उस ऑपरेटर को पहला कॉल int* लौटाएगा और दूसरा int लौटाएगा, और यह एक और ऑपरेटर बनाने के लिए मजबूर होगा, और मैं ऐसा नहीं करना चाहता।

मैं क्या कर सकता हूं? धन्यवाद,

+2

सीधे शब्दों में है, [इस तरह के एक ऑपरेटर मौजूद नहीं है] (http://en.cppreference.com/w/cpp/ देख सकते हैं भाषा/ऑपरेटरों), तो आप इसे अधिभारित नहीं कर सकते हैं। – skypjack

+1

ठीक है, इसका मतलब है कि मुझे ऑपरेटर [] के लिए दो फ़ंक्शन बनाना है, क्योंकि यदि मैं ऐसा करता हूं: '(((* यह) .matrix) [पंक्ति]) [col] 'तो पहला ऑपरेटर int * और दूसरा int। – LIMA

+0

@lilach दिखाएं कि डेटा सदस्य मैट्रिक्स कैसे परिभाषित किया गया है। –

उत्तर

6

बस, such an operator does not exist, इसलिए आप इसे अधिभारित नहीं कर सकते। मैट्रिक्स और पंक्ति:

सम्भावित समाधान दो वर्गों को परिभाषित करने के लिए है।
आप, इतना है कि यह देता है एक operator[]Matrix एक की परिभाषित कर सकते हैं इतना है कि यह एक वास्तविक मूल्य (int या जो भी आप चाहते हैं तो आपका Matrix भी एक टेम्पलेट हो सकता है) देता है तो के लिए एक ही ऑपरेटर परिभाषित करते हैं।
इस तरह, कथन myMatrix[row][col] कानूनी और सार्थक होगा।

एक नया Matrix पर में कोई मान बदलने के लिए किया जा सकता है।

* संपादित करें *

टिप्पणी में सुझाव दिया गया है, यह भी आप take in considerationoperator() बजाय operator[] तरह के एक मामले के लिए उपयोग करने के लिए करना चाहिए।
इस तरह, अब कक्षा की आवश्यकता नहीं होगी।

+0

मैं यह भी उल्लेख करता हूं कि ओवरलोडिंग ऑपरेटर'() 'एक आसान मार्ग है जो '[]' को अपने स्वयं के ऑपरेटर के साथ कुछ कस्टम क्लास वापस करने के लिए अधिभारित करता है। [] '। देखें [इस संबंध पर सी ++ पूछे जाने वाले प्रश्न] (https://isocpp.org/wiki/faq/operator-overloading#matrix-subscript-op) –

+0

बिल्कुल, यह समझ में आता है, लेकिन मैं समझ लिया है कि ओपी का लक्ष्य 'myMatrix [row] [col]' जैसे बयान का उपयोग करना है और यही कारण है कि मैं एक समाधान के साथ चला गया जो 'ऑपरेटर [] 'का उपयोग करता है। वैसे भी, अच्छा संकेत, मैं प्रतिक्रिया को संशोधित करने जा रहा हूं। – skypjack

+0

कैसे LINKER ROW और मैट्रिक्स के फ़ंक्शन के बीच अंतर करता है। दोनों int प्राप्त करते हैं। उनके पास एक ही हस्ताक्षर है। पहली बार ऑपरेटर इंडेक्स पंक्ति प्राप्त करता है और सूचकांक कॉल (int) – LIMA

2

आप कक्षा के लिए अपना खुद का operator [] परिभाषित कर सकते हैं। एक स्पष्ट दृष्टिकोण निम्नलिखित तरीके

#include <iostream> 
#include <iomanip> 

struct A 
{ 
    enum { Rows = 3, Cols = 4 }; 
    int matrix[Rows][Cols]; 
    int (& operator [](size_t i))[Cols] 
    { 
     return matrix[i]; 
    } 
}; 

int main() 
{ 
    A a; 

    for (size_t i = 0; i < a.Rows; i++) 
    { 
     for (size_t j = 0; j < a.Cols; j++) a[i][j] = a.Cols * i + j; 
    } 


    for (size_t i = 0; i < a.Rows; i++) 
    { 
     for (size_t j = 0; j < a.Cols; j++) std::cout << std::setw(2) << a[i][j] << ' '; 
     std::cout << std::endl; 
    } 
} 

कार्यक्रम उत्पादन

0 1 2 3 
4 5 6 7 
8 9 10 11 
+0

upvoted, भले ही उनके सहयोगियों ने उसे यकीन है कि के लिए नुकसान होगा एक बार वे इस ऑपरेटर को देखते हैं। :-) ... मैं अभी भी यह पता लगाने की कोशिश कर रहा हूं कि यह कैसे और क्यों काम करता है !! धन्यवाद, ज्ञान के लिए मेरी प्यास के लिए एक क्रिसमस उपहार। – skypjack

+0

यह काम करता है क्योंकि यह सरणी, जो फिर आगे के साथ अनुक्रमित किया जा सकता की चयनित पंक्ति के लिए एक संदर्भ रिटर्न '[]' - उस प्रकार 'है पूर्णांक और [कर्नल]', जो 'मैट्रिक्स का असली परिणाम प्रकार है [i ] इससे पहले कि यह एक सूचक में decays। हालांकि, इस तरह के संदर्भ को वापस करने वाले फ़ंक्शन के लिए सिंटैक्स सदस्य फ़ंक्शन पॉइंटर्स के समान लीग में बदसूरत और उलझन में है, इसलिए अधिकांश लोग इसके साथ परेशान नहीं होते हैं और प्रश्न में पंक्ति के पहले तत्व में केवल पॉइंटर लौटाते हैं। –

+0

Althoug मैं यहाँ और वहाँ एक अच्छा WAT सराहना करते हैं, मैं पीछे वापसी प्रकार – MikeMB

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