如何修复输入和索引运算符重载问题?
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 程序:[=32=]
#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;
}
当您输入 1234
时,实际发生的是您将其完全存储在 obj.ptr[size - 1]
中。您应该将每个数字切片并将其存储在单独的索引中。
您总是将输入的数字存储在 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 表示零索引)。
我正在尝试用 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 程序:[=32=]
#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;
}
当您输入
1234
时,实际发生的是您将其完全存储在obj.ptr[size - 1]
中。您应该将每个数字切片并将其存储在单独的索引中。您总是将输入的数字存储在
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 表示零索引)。