2017-04-20 64 views
0

我正在研究一个由2D矢量双精度构成的C++类。我即将创建2D矢量,但当我尝试编辑其中的值时,程序崩溃。我试过使用[] []运算符并将其设置为等于myDub,并且我尝试使用像myMat.editSlot(i,j,myDub)这样的类,并且都导致程序崩溃。2D矢量双编辑导致崩溃

// n ==可行和cols#(所有矩阵是方形的) // INFILE打开文件正确

mat my_mat(n,n); 

// Read input data 
for (int i=0; i<n; i++) { 
    for (int j=0; j<n; j++) { 
     double myDub; 
     inFile >> myDub; 

     my_mat.editSlot(i,j,myDub); 
    } 
} 

这里是类:

class mat 
{ 

    mat(int x , int y) { 
     int row = x; 
     int col = y; 
     vector<vector<double>> A(row , vector<double>(row , 0)); 


     for (int i = 0; i<row; i++) 
     { 
      for (int j = 0; j<col; j++) 
      { 
       cout << setw(6) << A[i][j]; 
      } 
      cout << endl; 
     } 
    } 

    void editSlot(int x , int y , double val) { 
     A[x][y] = val; 
    } 
    vector<vector<double>> A; 

private: 
    int n; 

}; 
+0

请创建一个[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)向我们展示。希望*建立*。 –

+0

哦,你应该考虑在哪里声明'A'的位置。 *和*如果'row!= col'会发生什么(考虑到*** local变量'A'的初始化)。 –

+0

也许你打算让矢量具有“col”列,而不是“row”列 –

回答

2

它看起来对我来说,你初始化A的方式是错误的。尝试这样的:

A = vector<vector<double>>(row , vector<double>(row , 0)); 

另一件考虑构造函数和编辑函数都没有公开。

+0

虽然这将解决问题所在,但它仍然是一个好的(或不好的,取决于观点)复制粘贴编程的例子。通过复制粘贴该行并进行轻微的编辑,您错过了一个微妙而重要的错误,如果使用'row!= col',将会发生。 –

+0

@Someprogrammerdude - OP已经提到数据是强类型和一致的,并且行将始终等于列。在这种情况下,不用担心。 – tinstaafl

+0

虽然对于这个特定的测试用例是正确的,但如果使用某种功能的可能性存在,那么有一天它会被使用。 –

0

导致粉碎的主要问题是您在构造函数中更改时间向量A的大小,而您在类对象中声明为字段的向量未被触及。 我建议做这样的事情:

mat(int x,int y) : A(y,vector<double>(x,0)) { 
int row = x; 
int col = y; 
    for(int i=0; i<row; i++) 
      { 
       for(int j=0; j<col; j++) 
       { 
        cout<<setw(6)<<A[i][j]; 
       } 
       cout<<endl; 
      } 
     } 
} 

在这种情况下,你不会在构造函数时间的目的隐藏在A类领域。 另请注意不要在你的函数中交换x和y。例如,你有一个错误在你editSlot功能:

void editSlot(int x , int y , double val) { 
    A[x][y] = val; 
} 

,它应该是:

A[y][x] = val; 

根据构造。