带有Overload []运算符的C ++ MyInteger类,因此索引返回位置i的数字

时间:2014-09-20 20:04:11

标签: c++ operator-overloading overloading

我遇到的问题

定义一个名为MyInteger的类,它存储一个整数,并具有获取和设置整数值的函数。然后,重载[]运算符,使索引返回位置i的数字,其中i = 0是最低有效数字。如果不存在这样的数字,则应返回-1。

我理解第一部分,但我不明白如何实现第二部分,

  

然后,重载[]运算符,使索引返回位置i的数字,其中i = 0是最低有效位。如果不存在这样的数字,则应返回-1。

我的代码是这样的:

#include <iostream>
using namespace std;

class MyInteger{
private:
  int integer;
public:
  MyInteger(int bInteger = 0)
  {
     integer = bInteger;
  }
  int getInteger(){ return integer; }
  void setInteger(int bInteger){ integer = bInteger; }

  void operator[](int x) //???
  {
  }

};

int main()
{

  cout << "Enter an integer " << endl;
  //cin >> 

}

4 个答案:

答案 0 :(得分:0)

据我了解第二部分,您必须实现运算符以返回单个数字。 以某种方式给出

MyInteger x;
x.set(43210)
int a = x[0];
int b = x[1];
int c = x[5];

a应该等于0,b应该等于1,c应该等于-1。要获得数字,您可以使用模运算:

获取任何整数的第一个数字(索引0)&#34; i&#34;只返回%10。获得第二个数字(索引1)

int result = ((i - (i%10)) % 100) / 100

表示第二个指数

int result = ((i - (i%10) - (i%100)) % 1000) / 1000

这可以通过for循环更加明确地制定。

答案 1 :(得分:0)

对于十进制数,您的类应返回与位置(索引)对应的十进制数字,例如如果MyInteger m = 12347,则运算符m [0]将返回7,m [3]将返回2,m [6]将返回-1。

答案 2 :(得分:0)

关于问题的第一部分,我建议你:

int operator[](int x) 
{
    int ten; 
    for (ten = 10; x; x--)
        ten *= 10; 
    int digit = (integer%ten) / (ten / 10);
    return digit; 
}

顺便说一句,为了简化测试,我建议您定义以下内容以允许在MyInteger上使用cin:

istream& operator>> (istream& is, MyInteger& x) 
{
    int v; 
    is >> v;
    x.setInteger(v); 
    return is;
} 

对于第二部分如果不存在此类数字,则应返回-1。,解决&#34;越界&#34;你可以拥有。例如,如果您有x = 21并且您执行x [3],则您使用上述程序返回0,而实际上没有第四位数字。

因此,您可以按如下方式更改operator[]的最后一条指令:

    return integer>=ten/10 ?  digit:-1; 

答案 3 :(得分:0)

我可以分享你的代码。 但我不确定解决问题是否最好。

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

class MyInteger
{
public:
	MyInteger(int integer);
	MyInteger();
	int operator[](int index);
	void set(int integer);
	int get();
private:
	int integer;
};
int main()
{
	MyInteger integer;

	integer.set(123456);
	cout<<"MyInteger: "<<integer.get()<<endl;
	int i;   /*position*/
	cout<<"Enter the reference from zero to fine digit>>";
	cin>>i;

	if(integer[i]==-1)
		cout<<"The integer doesn't exit.\n";
	else
	    cout<<"The digit is: "<<integer[i];

	system("pause");
	return 0;
}
MyInteger::MyInteger(int integer)
{
	this->integer=integer;
}
MyInteger::MyInteger()
{
	this->integer=0;
}
int MyInteger::operator[](int index)
{
	/*檢測是否在範圍內*/
	int size=0;
	int replacement=this->integer;
	do
	{
		replacement=replacement/10;
		size++;
	}while(replacement!=0);
	if(index>=size)
	{
		cout<<"It is not in range!\n";
			return -1;
	}
	
	/*找出位置上的digit*/
	int target=0;
	int head=pow(10.0,index+1);  /*去頭用*/
	target=(this->integer)-((this->integer)-(this->integer)%head);
	int foot=pow(10.0,index);    /*去尾用*/
	target=target/foot;
	
	
	return target;
}
void MyInteger::set(int integer)
{
	if((integer-(int)integer)==0)
		this->integer=integer;
	else
	{
		cout<<"It is not a intger!!";
		exit(1);
	}
}
int MyInteger::get()
{
	   return this->integer;
}
&#13;
&#13;
&#13;