0

我的代码来了。首先我定义了三个类

class matrix {protected: double *mdata; int rows,columns;

class polyg{protected: matrix x,y,z,centre;

class triangle: public polyg{protected:public: triangle(matrix x1,matrix y1,matrix z1){x=x1;y=y1;z=z1; centre=(x+y+z).change_scale(1/3); }

我已经为矩阵乘法定义了一个重载函数,例如

matrix operator*(matrix &m) const{
  if(columns!=m.getrows()) {
      cout<<"invalid size!!"<<endl; exit(1);
  }
  matrix temp(rows,m.getcols());
  for(int x=0; x<rows; x++) {
      for(int y=0; y<m.getcols(); y++) {
          double value = 0;
          for(int z=0; z<columns; z++) {
              value = value+(mdata[index(x+1,z+1)]*m.mdata[index(z+1,y+1)]);
          }
          temp.mdata[index(x+1,y+1)] = value;
      } 
  }
  return temp;}

索引函数定义为

int index(int m, int n) const // Return position in array of element (m,n){
if(m>0 && m<=rows && n>0 && n<=columns) return (n-1)+(m-1)*columns;
else {cout<<"Error: out of range"<<endl; exit(1);}

}

我在三角形类中定义了成员函数,它覆盖了polyg类中的纯虚函数,例如

    void rotate(double angle){

double pi=4*atan(1.0);
double angle_rad=pi*angle/180;

matrix m_rot(2,2);
m_rot(1,1)=cos(angle_rad);
m_rot(1,2)=sin(angle_rad);
m_rot(2,2)=cos(angle_rad);
m_rot(2,1)=-sin(angle_rad);//matrix of rotation of angle inserted

x=m_rot*x;
y=m_rot*y;
z=m_rot*z;//rotating the triangle

}

问题发生在

x=m_rot*x;
y=m_rot*y;
z=m_rot*z;

这部分。这部分发生堆损坏检测错误。如果我删除这部分,代码运行完全没有任何问题。

另外,如果我在 main 中定义

int main(){matrix a,b,c; c=a*b;

它也很好用。

但是,如果我使用我在三角形类中制作的函数,例如,

triangle tri(a,b,c); tri.rotate(30);

出现问题

调试前没有出现错误,但我编译后,发生堆损坏检测错误

有人可以解释是什么问题吗?以及如何解决?

4

1 回答 1

1

这段代码在我看来很可疑:

 for(int x=0; x<rows; x++) {
      for(int y=0; y<m.getcols(); y++) {
          double value = 0;
          for(int z=0; z<columns; z++) {
              value = value+(mdata[index(x+1,z+1)]*m.mdata[index(z+1,y+1)]);
          }
          temp.mdata[index(x+1,y+1)] = value;

随着z您迭代列索引,但是您将该值作为第一个参数传递给index函数(源现在不再出现在您的帖子中),该函数似乎假定第一个参数始终是行索引。

于 2013-05-14T22:44:02.057 回答