त्रुटि संदेश:

class.cpp: In function 'RationalNumber operator++(const RationalNumber&, int)':
class.cpp:27:28: error: assignment of member 'RationalNumber::numerator' in read-only object
  r.numerator = r.numerator+1;

यह "केवल-पढ़ने योग्य वस्तु में" क्यों है?

कक्षा.एच फ़ाइल

#ifndef CLASS_H
#define CLASS_H
#include <iostream>
using namespace std;
// #include "class2.h"

class RationalNumber
{
 private:
  int numerator,denominator;
 public:
    RationalNumber(int x,int y);
    RationalNumber();
    friend ostream& operator << (ostream& os,const RationalNumber& x);
    friend RationalNumber operator++ (const RationalNumber& r, int dummy);
    RationalNumber operator- (const RationalNumber& r) {
        RationalNumber r3;
        //cout << numerator << " " << r.numerator<<endl;
        r3.numerator = (numerator * r.denominator)-(r.numerator * denominator);
        r3.denominator = r.denominator * denominator;
        return r3;
    }

};
#endif

मुख्य.सीपीपी

#include <iostream>
using namespace std;
#include "class.h"
// #include "class2.h"

int main()
{
    RationalNumber r1(21,7),r2(67,31),r3;
    r3 = r1 - r2;
    cout << r3;
    r1++;
    cout << r1;
}

Cpp भाग त्रुटि के साथ

RationalNumber operator++ (const RationalNumber& r, int dummy) 
{
    RationalNumber temp;
    temp = r;
    r.numerator = r.numerator+1;
    return temp;
}
-1
jaxk 25 मार्च 2020, 22:37
4
r स्थिरांक है। आप इसे बदल नहीं सकते।
 – 
tkausl
25 मार्च 2020, 22:39
मैं दूसरी बात करता हूं कि यह भ्रमित करने वाला है, अगर मैं RationalNumber r; ... r++; देखता हूं तो मैं इसे 1 से बढ़ने के लिए छोड़ देता हूं। RationalNumber x(3,6); को बढ़ाने के बारे में ++ 1/6 या 1/2 से वृद्धि कैसे होगी क्योंकि 3/6 == 1/2 ?
 – 
463035818_is_not_a_number
25 मार्च 2020, 22:58

2 जवाब

संभवतः, आपका इरादा temp के मान को operator++() में बदलना था; यदि ऐसा है, तो आपके पास त्रुटि उत्पन्न करने वाली त्रुटि है क्योंकि आप r को संशोधित करने का प्रयास कर रहे हैं जो कि एक const वस्तु है। आप शायद लिखना चाहते थे:

RationalNumber operator++ (const RationalNumber& r, int dummy) 
{
    RationalNumber temp;
    temp = r;
    temp.numerator = temp.numerator+1; // NOT "r.numerator = ..."
    return temp;
}

(जिसे थोड़ा छोटा किया जा सकता है या विभिन्न तरीकों से ट्वीक किया जा सकता है; मैंने स्पष्टता के लिए आपकी मूल कोडिंग शैली छोड़ दी है। आपको int तर्क dummy) का उपयोग न करने के लिए एक कंपाइलर चेतावनी भी मिल सकती है।

यह देखते हुए कि आप वास्तव में उपयोग नहीं कर रहे हैं int dummy यह सुझाव देता है कि आप अपने द्वारा पोस्ट किए गए पोस्टफिक्स के बजाय उपसर्ग ++ लिखने का प्रयास कर रहे होंगे। लिखित। जैसा कि आप इस उत्तर से देख सकते हैं, सिंटैक्स थोड़ा अलग है; आप कुछ ऐसा लिखेंगे

RationalNumber& operator++() // no args: prefix
{
    ++(this->numerator); 
    return *this;
}

जबकि यह संकलक त्रुटि को ठीक कर देगा, आपको कुछ चरणों का बैकअप लेना चाहिए और यह निर्धारित करना चाहिए कि क्या operator++() वास्तव में आपकी कक्षा के लिए मायने रखता है; ++ के लिए कई उचित अर्थ स्थापित किए जा सकते हैं। आप शायद operator+() को "इन्क्रीमेंटिंग" के बजाय दो RationalNumber जोड़ना चाहते हैं।

1
Ðаn 26 मार्च 2020, 00:38

जैसा कि बताया गया है, const ऑपरेटर इंगित करता है कि आप r को संशोधित नहीं कर सकते। यहां आपके पोस्टफिक्स ++ ऑपरेटर की सही घोषणा और कार्यान्वयन है:

...
    friend RationalNumber& operator++ (RationalNumber& r, int dummy);
...
RationalNumber& operator++ (RationalNumber& r, int dummy) 
{
    r.numerator += 1;
    return r;
}

हालाँकि, जैसा कि बताया गया है, इस तरह से इंक्रीमेंट ऑपरेटर का उपयोग करना भ्रामक है। यह अधिक समझ में आता है यदि यह अंश को 1 से बढ़ाता है और अंश को 1 से नहीं बढ़ाता है। जैसे 3/7 + 1 = 10/7
इसके बजाय, आप 3/7 + 1/7 = 4/7 . कर रहे हैं

नोट: मैंने अस्थायी चर को हटा दिया है ताकि आप मूल वस्तु वापस कर दें क्योंकि ऑपरेटर का यही मतलब है, न कि कोई नई वस्तु बनाना।

-1
amr ras 25 मार्च 2020, 23:30