これが私のコードです。まず、3つのクラスを定義しました
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);}
}
そして、ポリグクラスの純粋仮想関数をオーバーライドするメンバー関数を、次のような三角形クラスで定義しました
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;
この部分。この部分からヒープ破損検出エラーが発生します。この部分を削除すると、コードは問題なく完全に実行されます。
また、メインで定義すると
int main(){matrix a,b,c; c=a*b;
それも完全にうまく機能します。
ただし、三角形のクラスで作成した関数を使用すると、たとえば、
triangle tri(a,b,c); tri.rotate(30);
問題が発生
デバッグ前にエラーは発生しませんが、コンパイル後に Heap Corruption detected エラーが発生します
誰かが何が問題なのか説明できますか? そしてそれを修正する方法は?