为什么我的拷贝构造函数有一个“未定义的引用”错误?

问题描述:

我以为我已经为我的initializer-list constructor正确设置了一切,但显然还是有一些问题。它应该是一个overloaded constructor为我的Matrix class,从这种类型的输入创建一个MatrixMatrix d = {{1,3}, {5,9};我知道我的一个定义是不正确的,但我不能解码哪一个(s)。为什么我的拷贝构造函数有一个“未定义的引用”错误?

Matrix::Matrix(const i_list & list){ 
    uint rows = list.size(); 
    uint cols = list.begin()->size(); 
    int i = 0; 
    mat = new double*[rows]; 
    for(uint m = 0; m < rows; m++){ 
    mat[m] = new double[rows]; 
    } 
    for(uint n = 0; n < rows; k++){ 
    for(uint w = 0; w < cols; w++){ 
     mat[n][w] = *(list.begin()[n].begin[w] + i); 
     i++; 
    } 
    } 
+2

你可能想的'矩阵(常量矩阵和PARAM)'签名。这里是复制构造函数[reference](http://en.cppreference.com/w/cpp/language/copy_constructor)。 – Ron

+0

'mat [m] = new double [rows];'不应该是'cols'? – Caleth

+2

'i_list'是'std :: initializer_list >'的别名吗? – Caleth

该行mat[n][w] = *(list.begin()[n].begin[w] + i);基本上是无稽之谈。您可以循环输入,这意味着您不需要单独的循环。

Matrix::Matrix(const i_list & list){ 
    mat = new double*[list.size()]; 
    for(auto r = list.begin(); r != list.end(); ++r){ 
    auto row = mat[r - list.begin()] = new double[r->size()]; 
    for(auto c = r->begin(); c != r->end(); ++c){ 
     row[c - r->begin()] = *c; 
    } 
    } 
} 

但是你应该做是从**double改变matstd::vector<std::vector<double>>,此时它变成:

Matrix::Matrix(const i_list & list) : mat(list) {} 
+1

这似乎是一个更好,更干净的方法。我尝试了嵌套的for-loops,因为我想用它填充行和列,但我想我现在要用这种方式尝试。 – SlackStack