重载[ ]操作符
一个很简答的题目,用类输出一个等边直角三角形。比如0
0 0
0 0 0
0 0 0 0
0 0 0 0 0
程序开始的时候输入行数,然后运行类中带的print函数就输出上面的图形。 类中还有 setvalue函数可以改变每一个点的值。 这个类中我重载了 [ ]操作符, 假如有一个这种类型的对象 t, 我通过操作符重载 使得t[r]返回第r行第0列的地址,然后t[r][c]可以的到第r行第c列的那个数。 现在问题出来了,比如我想改变第三行第二个数,我可以直接t[3][2]=x. 但是如果我写成t[3][5]=x,(第三行没有第五列) 那么就会出现 t[4][1]=x. 在这里我不希望当列数大于行数的时候会引起其他行的改变。我希望当列数大于行数的时候不作任何改变。请问要怎么做。谢谢
#include<iostream>
#include<iomanip>
using namespace std;
class Triangle {
private:
int nr; //这个变量是行数
int *p; //int 型指针变量。用来存储组成图形的每个点的那个数
public:
Triangle(int nrv)
{
nr = nrv;
p = new int[nr*(nr+1)/2];
}
void setValue(int r, int c, int v) {
if (c>r)
return;
p[r*(r+1)/2+c] = v;
}
int * operator[] (int r)//这里就是重载[]的部分
{if(r<nr)
return p + r*(r+1)/2;
}
int size();
int getValue(int r, int c);
void print();
void clear(); //zero out the triangle
};
int Triangle::size() {
return nr;
}
int Triangle::getValue(int r, int c) {
return p[r*(r+1)/2+c];
}
void Triangle::print() {
for(int r=0; r<nr; r++) {
for(int c=0; c<=r; c++)
cout<< setw(3) << p[r*(r+1)/2+c];
cout<<endl;
}
}
void Triangle::clear() {
int sz = nr*(nr+1)/2;
for(int i=0; i<sz; i++)
p[i] = 0;
}
int main() {
Triangle t(10);
t.clear();
t[3][4] = 7;
t.print();
system("pause");
}
[ 本帖最后由 fl8962 于 2014-9-6 03:50 编辑 ]