如何修复输入和索引运算符重载问题?

How can I fix the input and index operator overloading problem?

我正在尝试用 C++ 语言实现索引和输入运算符重载([] 和 >>)。该程序应该要求用户输入一个整数然后它应该打印这个整数的数字,但我的程序不能正常工作。我不明白问题出在哪里。我该如何解决这个问题?在此先感谢您的帮助。

我的程序给出的输出:

Default constructor of Integer class
Enter a 4 digits number: 6748
0th digit of the number: 6748
1st digit of the number: -858993460
2nd digit of the number: -858993460
3rd digit of the number : -858993460
Destructor of Integer class
Destructor of Integer class

我想要的输出:

Default constructor of Integer class
Enter a 4 digits number: 6748
0th digit of the number: 8
1st digit of the number: 4
2nd digit of the number: 7
3rd digit of the number : 6
Destructor of Integer class
Destructor of Integer class

我的Integer.hclass:

#include <iostream>
#pragma once
#ifndef INTEGER_H
#define INTEGER_H
#define size 4
using namespace std;

class Integer {
    friend istream& operator>>(istream& inp, Integer& obj); // >> operator overloading
private:
    int r, i;
    int ptr[size];

public:
    //Integer(); //default constructor
    Integer();
    Integer(int*);
    ~Integer(); //destructor

    int& operator[](int index);  //[] operator overloading
};
#endif // !INTEGER_H

Integer.cpp

#include "Integer.h"
Integer::Integer() {
    cout << "Default constructor of Integer class" << endl;
}
Integer::~Integer() {
    cout << "Destructor of Integer class" << endl;
}

Integer::Integer(int* p) {
    //n = ptr;
    if(size!=0){
        for (int i = 0; i < size; i++) {
            //memcpy(p, ptr, 4 * sizeof(int));
            p = ptr;
            //ptr[i] = p[i];
            //ptr[i]=p[i];
    }

    }
}
istream& operator >> (istream& inp, Integer &obj) {
    inp >> obj.ptr[size-1];
    return inp;

}

int& Integer::operator[](int index) {
    if (index >= 0 && index < size) {
        return ptr[index];
    }
    /*if (index >= size && size<0) {
        cout << "Wrong size!" << endl;
        exit(0);
    }
    return ptr[index];*/
}


Main.cpp 程序:[=3​​2=]

#include <iostream>
#include "Integer.h"
using namespace std;

int main() {
    Integer a;


    cout << "Enter a 4 digits number: ";
    cin >> a;
    Integer a1(a);
        cout << "0th digit of the number: " << a[3] << endl;
        cout << "1st digit of the number: " << a[2] << endl;
        cout << "2nd digit of the number: " << a[1] << endl;
        cout << "3rd digit of the number : " << a[0] << endl;



    return 0;

}

您的代码中有几个错误。 在您的输入函数中:

istream& operator >> (istream& inp, Integer &obj) {
    inp >> obj.ptr[size-1];
    return inp;

}
  1. 当您输入 1234 时,实际发生的是您将其完全存储在 obj.ptr[size - 1] 中。您应该将每个数字切片并将其存储在单独的索引中。

  2. 您总是将输入的数字存储在 ptr[size - 1] 中,它始终是数组中的最后一个元素。如果你想分割你的数字,你应该 increment/decrement 你正在修改数组的索引。

如果我是你,我可能会这样做:

istream& operator >> (istream& inp, Integer &obj) {
    int input;
    inp >> input;
    while(sizePtr >= 0) {
        obj.ptr[sizePtr--] = input % 10;
        input /= 10;
    }
    return inp;
}

其中 sizePtr 是一个非常量变量,作为 ptr 对象数组的大小(-1 表示零索引)。