为啥当我重载数组运算符时我的私有变量为零? [关闭]

Posted

技术标签:

【中文标题】为啥当我重载数组运算符时我的私有变量为零? [关闭]【英文标题】:Why does my private variable equal zero when I overload the array operator? [closed]为什么当我重载数组运算符时我的私有变量为零? [关闭] 【发布时间】:2017-03-10 00:07:02 【问题描述】:

我正在编写一个带有名为 MyInteger 的类的程序,该类存储一个整数并具有获取和设置整数值的函数。然后我必须重载 [] 运算符,以便索引返回位置 i 中的数字,其中 i=0 是最低有效数字。

#include <iostream>
#include <cmath>
using namespace std;

class MyInteger

public:

    MyInteger();
    MyInteger(int n);
    int& operator[](int index);
    void setNumber(int);
    int getTotalDigits();
    int getNumber() const;


private:
    int number;
    int totalDigits;
    int digitArray[20];
    friend ostream& operator <<(ostream&, MyInteger&);
;

int main()

    MyInteger b(4);

    cout << b.getNumber() << endl;

    return 0;


MyInteger::MyInteger() : number(0)




MyInteger::MyInteger(int n) :number(n)




int MyInteger::getNumber() const

    return number;


void MyInteger::setNumber(int n)

    number = n;


int MyInteger::getTotalDigits()

    totalDigits = 0;
    int count = 0;

    while (number > 0)
    
        number = number / 10;
        totalDigits++;
    

    return totalDigits;



ostream& operator <<(ostream& outputStream, MyInteger& I)

    outputStream << I.getNumber();

    return outputStream;


int& MyInteger:: operator [](int index)

    getTotalDigits();
    cout << number << endl; // This comes out to be zero
    digitArray[totalDigits - 1] = number*pow(10, totalDigits - 1);
    for (int i = totalDigits - 1; i > 0; i--)
    
        digitArray[i - i] = digitArray[i] * pow(10, totalDigits - 1);
    

    return digitArray[index];


当我尝试访问重载函数定义[] 中的私有变量number 时,它输出为零。这是为什么呢?

【问题讨论】:

请edit您的问题提供minimal reproducible example。 调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行逐行检查您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。 最好不要将totalDigits作为成员变量;而operator[]等函数应该使用getTotalDigits的返回值 【参考方案1】:

成员函数getTotalDigits改变私有数据成员number

int MyInteger::getTotalDigits()

    totalDigits = 0;
    int count = 0;

    while (number > 0)
           ^^^^^^^^^^
    
        number = number / 10;
        totalDigits++;
    

    return totalDigits;

一个正确的实现可以是

int MyInteger::getTotalDigits() const

    totalDigits = 0;

    int value = number;

    do  totalDigits++;  while ( value /= 10 );

    return totalDigits;

而且重载的operator [] 本身也没有意义。

【讨论】:

谢谢。是的,我知道重载运算符没有意义。我能够修复它。再次感谢您

以上是关于为啥当我重载数组运算符时我的私有变量为零? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我使用“require”时我的变量未定义? [复制]

为啥当我使用箭头函数 onClick 时我的变量未定义?

为啥我的 UILabel 变量总是为零?

Image 类的析构函数和重载 = 运算符

为啥麦克风关闭时基频和幅度不为零?

为啥当我使用 [:] 时我的子类的 __getitem__ 和 __setitem__ 没有被调用?