创建一个新对象似乎改变了以前创建的另一个对象(???)

时间:2014-12-24 11:57:09

标签: c++ undefined-behavior

我有一个我正在写的课程。 它包含一个表示为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   |
--

非常感谢您的帮助!

2 个答案:

答案 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   |
--

我真的不知道这个问题!