2017-10-13 18 views
0

私はinitializer-list constructorのためにすべてを正しく設定したと思っていましたが、明らかにまだ何かが残っています。私のMatrix classoverloaded constructorと入力して、このタイプの入力からMatrixを作成します。Matrix d = {{1,3}, {5,9};私の定義の1つが間違っているとわかりますが、どれを解読できません。コピーコンストラクタで「未定義の参照」エラーが発生するのはなぜですか?

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

答えて

2

ライン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; 
    } 
    } 
} 

しかし、あなたを行うべきことは、それがなると、その時点でstd::vector<std::vector<double>>**doubleからmatを変更です:

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

これは、より良い、よりクリーンなアプローチのようです。私は入れ子になっているfor-loopsを試しました。なぜなら、行と列を埋めたいからですが、今のところこのようにしようと考えています。 – SlackStack

関連する問題