创建新对象似乎会更改之前创建的另一个对象 (???)

Creating a new object seems change another object previously created (???)

本文关键字:创建 一个对象 新对象 对象      更新时间:2023-10-16

我有一个我正在编写的类的探针。它由一个矩阵组成,表示为 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   |
--

我真的不知道这个问题!