我有一个我正在写的课程。 它包含一个表示为std :: array的std :: array的Matrix。所以第一个数组是一种列或行的容器(这可以由用户决定)。 该类通过使用布尔值来保持这种情况。
当我创建一个单独的实例时,似乎一切正常,当我创建另一个实例时出现问题:第二个实例是正常的,而在第一个实例中布尔值更改。 我无法弄清楚这种行为的原因。
只有将initializeToZero()方法放在默认构造函数中,或者也使用复制构造函数时,才会出现问题。此外,2实例必须具有相同的numberOfColumn,否则问题不会出现。
我链接了代码中最相关的部分:
#include <stdio.h>
#include <array>
using namespace std;
template <typename scalar,int numberOfRows,int numberOfColumns> class FullArrayMatrix {
bool onlyColumnBased; //if true the first array contains the columns
array<array<scalar, numberOfRows>, numberOfColumns> verticalMatrixArray;
array<array<scalar, numberOfColumns>, numberOfRows> horizontalMatrixArray;
// if onlyColumnBased is true tre programm considers only verticalMatrixArry, if false only horizontalMatrixArray
public:
///CONSTRUCTOR
FullArrayMatrix (bool forceColumnBased=true):onlyColumnBased(forceColumnBased){
initializeToZero();
} //default initializer
bool getOnlyColumnBased() const;
void print();
///OPERATOR
scalar & operator ()(int riga, int colonna);
};
//initializeToZero
template <typename scalar,int numberOfRows,int numberOfColumns>
void FullArrayMatrix<scalar,numberOfRows,numberOfColumns>::initializeToZero() {
for (int i=1; i<=numberOfRows; i++) {
for (int j=1; j<=numberOfColumns; j++) {
if ((*this)(i,j)) {
(*this)(i,j)=0;
}
}
}
}
//print
template<typename scalar,int numberOfRows,int numberOfColumns> void FullArrayMatrix<scalar, numberOfRows, numberOfColumns >::print(){
cout<<endl<<"--"<<endl;
if (getOnlyColumnBased()) {
for (int i=1; i< numberOfRows+1; i++) {
cout<<"|\t";
for (int j=1; j< numberOfColumns+1; j++) {
cout<<(*this)(i,j)<<"\t";
}
cout<<"|"<<endl;
}
}
else {
for (int i=1; i< numberOfColumns+1; i++) {
cout<<"|\t";
for (int j=1; j< numberOfRows+1; j++) {
cout<<(*this)(i,j)<<"\t";
}
cout<<"|"<<endl;
}
}
cout<<"--"<<endl;
}
template <typename scalar,int numberOfRows, int numberOfColumns> scalar & FullArrayMatrix<scalar,numeroRighe,numeroColonne>::operator ()(int row, int column){
if (getOnlyColumnBased()) {
return verticalMatrixArray[column][row];
} else {
return horizontalMatrixArray[row][column];
}
}
这是主要的:
FullArrayMatrix<double, 10, 1> full1(true);
full1.print();
cout<<full1.getOnlyColumnBased()<<endl;
FullArrayMatrix<double, 10, 1> full2(true);
cout<<endl<<endl<<full1.getOnlyColumnBased()<<full2.getOnlyColumnBased()<<endl;
full1.print();
full1.initializeToZero();
full1.print();
这是输出:
--
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
--
1
01
--
| 0 0 0 0 0 0 0 0 0 3.49057e-320 |
--
--
| 0 0 0 0 0 0 0 0 0 0 |
--
非常感谢您的帮助!
答案 0 :(得分:1)
看起来你有一个错误的错误(#34;计算机科学中存在两个难题:命名事物,缓存一致性和逐个错误&#34;):C ++使用零基础阵列。您正在1
方法中访问索引numberOf...
... initializeToZero()
。结果,您将有一个缓冲区溢出,这显然会导致您的某些变量被覆盖。
答案 1 :(得分:0)
在第一次评论后我发现了一个愚蠢的错误,现在唯一的问题是在复制构造函数中。如前所述,它似乎改变了输入矩阵中的onlyColumnBased
。
它怎么能改变这个价值? inputMatrix
是const引用,不是吗?
代码如下:
在宣言中:
FullArrayMatrix (const FullArrayMatrix<scalar,numeroRighe,numeroColonne> &inputMatrix,bool forceColumnBased=true);
在实施中:
template <typename scalar,int numberOfRows, int numberOfColumns> FullArrayMatrix<scalar, numberOfRows, numberOfColumns >::FullArrayMatrix (const FullArrayMatrix<scalar, numberOfRows, numberOfColumns > &matriceInput,bool forceColumnBased):onlyColumnBased(forceColumnBased){
cout<<endl<<endl<<matriceInput.getOnlyColumnBased()<<onlyColumnBased;
if (!onlyColumnBased) {
for (int i=1; i< numberOfRows +1; i++) {
for (int j=1; j< numberOfColumns +1; j++) {
(*this)(i,j)=inputMatrix.horizontalMatrixArray[j-1][i-1];
}
}
} else {
for (int i=1; i< numberOfColumns +1; i++) {
cout<<endl<<"column "<<i<<" "<<inputMatrix.getOnlyColumnBased();
for (int j=1; j< numberOfRows +1; j++) {
cout<<endl<<"row "<<j<<" "<<inputMatrix.getOnlyColumnBased();
(*this)(i,j)=inputMatrix.verticalMatrixArray[i-1][j-1];
}
}
}
cout<<inputMatrix.getOnlyColumnBased();
}
我在cout
更改时会注意到onlyColumnBased
,并且它似乎在第1列第3行发生了变化。
这是主要的:
FullArrayMatrix<double, 10, 1> full1(true);
full1.print();
FullArrayMatrix<double, 10, 1> full2(full1,true);
full1.print();
这是输出:
--
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
--
11
column 1 1
row 1 1
row 2 1
row 3 1
row 4 0
row 5 0
row 6 0
row 7 0
row 8 0
row 9 0
row 10 0
0
--
| 0 0 0 0 0 0 0 0 0 0 |
--
我真的不知道这个问题!