我正在尝试重载操作符〜转置给定矩阵:
这是我的代码:
virtual B operator~()const
{
B a(column,row);
for (int i = 0; i<row; i++)
{
for (int j = 0; j<column; j++)
{
a.e[i] = e[j];
}
}
return a;
}
是指向存储B
的所有整数元素的存储器的指针int *const e;
但是在输出上我得到了一个由零填充并且大小相同的矩阵。我的意思是如果我转换5x2,我得到相同的5x2由零填充。
编辑: 我的建筑师:
B(int r, int c)
: row(r), column(c), e(new int[r*c])
{
for (int i = 0; i < r*c; i++)
{
e[i] = 0;
}
}
答案 0 :(得分:1)
您的代码未正确填充a.e
:它不是转置矩阵,而是覆盖与同一行对应的区域,其中包含不同列的数字。
假设行主要顺序,代码应如下所示:
for (int i = 0; i<row; i++)
{
for (int j = 0; j<column; j++)
{
a.e[j*row+i] = e[i*column+j];
}
}
由于您提到您的结果填充了零,因此复制构造函数和/或赋值运算符的逻辑可能无法正确编码。请注意,由于B::e
是动态分配的,you need a destructor as well。
答案 1 :(得分:0)
B a(column,row);
for (int i = 0; i<row; i++)
{
for (int j = 0; j<column; j++)
{
a.e[i] = e[j];
}
}
不能访问 this 或 a 中的大多数元素。仅访问元素 0 到列和 0 到行。
归零构造函数没有显示行/列的存储方式,但猜测是
int& B::at(int r, int c){
return e[r*column + c];
}
替代方案是
return e[c*row + r];
在这种情况下,您可以通过
进行转置virtual B operator~()const
{
B a(column,row);
for (int i = 0; i<row; i++)
{
for (int j = 0; j<column; j++)
{
a.at(i, j) = at(j, i); // swap row, column
}
}
return a;
}
答案 2 :(得分:0)
首先,你似乎总是在转置中设置第一个[0..row]元素,原始中每一行的最后一个元素都停在那里。
其次,我不知道B是如何在内部铺设的,但是因为你可以指定矩阵的大小,我推断出用于存储元素的内部数组是在一维中动态分配的缓冲。这意味着您有一个复制构造函数,以避免在方法结束时删除 a 时出现问题。你得到很多0可能意味着(除了你不扫描整个矩阵的事实),你的复制构造函数没有正确实现。
编辑看到您对问题的编辑,我倾向于确定复制构造函数是问题所在。您没有崩溃,因为5x2 = 2x5元素(因此内部缓冲区的大小相同)。