创建新对象似乎会更改之前创建的另一个对象 (???)
Creating a new object seems change another object previously created (???)
我有一个我正在编写的类的探针。它由一个矩阵组成,表示为 std::array of std::array。所以第一个数组是一种列或行的容器(这可以由用户决定)。该类通过使用布尔值来保持这一点。
当我创建这一切的单个实例时,当我创建另一个实例时会出现问题:第二个实例正常,而在第一个实例中布尔值发生变化。我无法弄清楚这种行为的原因。
仅当我将 initializeToZero() 方法放在默认构造函数中或与复制构造函数一起使用时,才会出现问题。此外,2 个实例必须具有相同的列数,否则不会出现问题。
我链接到代码中最相关的部分:
#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 |
--
非常感谢您的任何帮助!
似乎你有一个逐个错误("计算机科学中有两个难题:命名事物、缓存一致性和逐个错误"): C++使用从零开始的数组。您正在访问索引1
...numberOf...
您的initializeToZero()
方法。结果,您将出现缓冲区溢出,这显然会导致某些变量被覆盖。
在第一条评论之后,我发现了一个愚蠢的错误,现在唯一的问题是在复制构造函数中。如前所述,它似乎改变了输入矩阵中的onlyColumnBased
。它如何更改此值? inputMatrix
是一个常量引用,不是吗?
代码如下:
在声明中:
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 |
--
我真的不知道这个问题!
相关文章:
- 如何创建一个对象创建函数,该函数将由与其关联的名称调用?
- 我如何仅一次或一次创建一个对象
- 为什么我们需要在堆中创建一个对象
- 我是否要创建一个对象来使用C 中的类方法
- 在C 中,您可以创建一个对象作为arg function
- 在矢量内创建一个对象,该对象由另一个对象包含
- 在c++中有条件地创建一个对象
- Qt C++根据组合框中的选择创建一个对象
- 如果对象尚未在集合中,则创建一个对象
- 在一个线程中创建一个对象,并使用std :: Atomic访问另一个对象
- 如果我在析构函数中创建一个对象,会发生什么
- 而不是在 lua 中创建一个对象,如何让 lua 直接高C++对象来启动方法?
- 销毁和重新创建一个对象会使指向该对象的所有指针无效吗
- C++:创建一个对象数组
- 我想在我的main中为下面的代码创建一个对象..那么我该怎么做呢
- 自定义内存管理,用于在文件中每行创建一个对象
- 是否可以在一个对象中创建一个对象,该对象的构造函数是在c++中创建它的对象
- 从另一个字符串向量创建一个对象向量
- 我必须创建一个对象来调用类方法吗?或者我可以只键入类名吗
- 用c++中的模板创建一个对象