2016-05-20 2 views
-2

Я пишу класс манипуляции матрицей в C++ в качестве проекта курса. Я хочу, чтобы синтаксис был как можно ближе к MATLAB. Я хотел бы реализовать конструктор для матрицы, которая позволяет мне сделать что-то вроде того, что показано ниже:Контрактор для матричного класса в C++

Matrix X(3,3) = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 
//  [1 2 3] 
// X = [4 5 6] 
//  [7 8 9] 

Я попытался с помощью initializer_list конструктор, но это только позволяет мне делать:

Matrix X(3,3,{1, 2, 3, 4, 5, 6, 7, 8, 9}); 

Вот мой код для этого конструктора:

Matrix::Matrix(size_t row, size_t col) : nrow(row), ncol(col), len(row*col) { 
    mat = std::unique_ptr<double[]>(new double[len]); 
} 

void Matrix::operator= (std::initializer_list<double> list) { 
    if (list.size() != len) 
     throw std::length_error("Sizes of matrix and initializer list do not match"); 
    auto it = list.begin(); 
    for (int i = 0; it != list.end(); ++i, ++it) 
     mat[i] = *it; 
} 

Matrix::Matrix(size_t row, size_t col, std::initializer_list<double> list) : Matrix::Matrix(row, col) { 
    *this = list; 
} 

Мне нужны предложения о том, как реализовать первый.

+2

Почему бы не использовать 'std :: vector ' вместо 'std :: unique_ptr '? – NathanOliver

+0

@NathanOliver Возможно, я ошибаюсь, но я думаю, что массивы быстрее и легче по сравнению с векторами. –

+0

Производительность 'std :: vector' должна быть такой же быстрой. У вас все еще есть распределение памяти в обоих случаях, а затем скорость доступа должна быть одинаковой. – NathanOliver

ответ

2

Ваша проблема с синтаксисом.

Matrix X(3,3) = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 

не является законной с ++, так как вы используете как direct initialization синтаксиса и aggregate initialization синтаксиса в одной декларации. Это означает, что вы не можете работать. Вы можете, однако, сделать что-то вроде этого:

Matrix X(3,3); 
X = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 

, который, как я считаю, будет работать с вашим кодом.

+0

Да, второй работает с моим кодом. –

Смежные вопросы