注册 登录
编程论坛 C++教室

重载[ ]操作符

fl8962 发布于 2014-09-06 03:49, 440 次点击
一个很简答的题目,用类输出一个等边直角三角形。比如
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 编辑 ]
2 回复
#2
天使梦魔2014-09-08 15:09
t[3][4] = 7;
第二个括号[4]不是调用你的重载,而是C默认数组。
你以为写一个重载就可以调用二维?
可以试试代理类

http://bbs.
这贴的第5,6楼
#3
fl89622014-09-09 07:19
回复 2 楼 天使梦魔
我知道,我只重载了第一个[]但是我就是求方法让第二个[]不进行默认的操作。正在看CSDN上提到的代理类。
1