Я заметил несколько проблем с вашим кодом.Первые несколько уже упоминались другими, такими как ваш член double a[];
Это неинициализировано, и C ++ не допускает векторы переменной длины.Для решения этой проблемы есть два возможных решения, о которых я расскажу в ближайшее время.Другая проблема, о которой упоминали другие, заключается в том, что в вашей функции Matrix::fillMatrix()
переменная в вашем цикле for i
также неинициализирована, поэтому i
может быть чем угодно, и это приведет к неопределенному поведению.
Вот некоторые проблемы, которые не были упомянуты другими:
В своем определении конструктора вы пытаетесь инициализировать m
с a[impm*inpm]
Я думаю, что это может быть опечатка вваша частьДругой - вы объявляете свою функцию как ::fillMatrix()
, но вы определяете ее вне объявления класса как ::fillmatrix()
.Опять же, я думаю, что это может быть просто опечатка с вашей стороны.
Что касается вышеприведенной проблемы с использованием массивов в C++
, то самый простой способ сделать это - это то, что уже заявили другие, и это использоватьstd::vector<type>
.
Другой способ - написать класс, который работает аналогично std::vector
, но имеет механику матрицы.Ваш класс выглядел бы примерно так с использованием шаблонов: если вы хотите, чтобы контейнер переменной длины во время выполнения, вы должны знать, что его размер во время компиляции, с помощью шаблонов здесь может помочь, так как шаблон должен быть выведен во время компиляции при создании!
template<class T, unsigned N>
class Matrix {
private:
static const unsigned Stride = N;
static const unsigned Size = Stride * Stride;
T data[Size] = {};
public:
Matrix() {};
void fillMatrix( const T* dataIn );
void printMatrix();
};
template<class T, unsigned N>
void Matrix<T, N>::fillMatrix( const T* dataIn ) {
for( unsigned int i = 0; i < Size; i++ ) {
this->data[i] = dataIn[i];
}
}
template<class T, unsigned N>
void Matrix<T, N>::printMatrix() {
for( unsigned int i = 0; i < Stride; i++ ) {
for( unsigned int j = 0; j < Stride; j++ ) {
std::cout << this->data[i*Stride + j] << " ";
}
std::cout << '\n';
}
}
int main() {
// 2x2 = 4
double ain[4] = { 1,2,3,4 };
double bin[4] = { 5,6,7,8 };
Matrix<double, 2> A;
Matrix<double, 2> B;
A.fillMatrix( ain );
A.printMatrix();
std::cout << '\n';
B.fillMatrix( bin );
B.printMatrix();
std::cout << '\n';
// test A again
A.printMatrix();
std::cout << '\n';
B.printMatrix();
std::cout << '\n';
// Try it with other types
// 3x3 = 9
char data[9] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i' };
Matrix<char, 3> C;
C.fillMatrix( data );
C.printMatrix();
std::cout << '\n';
return 0;
}
Вывод:
1 2
3 4
5 6
7 8
1 2
3 4
5 6
7 8
a b c
d e f
g h i
При таком типе дизайна с использованием шаблонов вы не ограничены использованием только одного type
, например int
, float
и т. Д. Вы даже можете использоватьUser Defined Types
.Единственное, что вам нужно учесть, это любой тип operators
, который у вас может быть.Кроме того, способ написания этого класса всегда создает матрицу MxM
, которая всегда будет квадратной матрицей.Если вам нужна неквадратная матрица;Вы можете просто добавить к этому классу, добавив 2 nd константу без знака в список параметров шаблона и переименовав их соответственно для MxN
.Затем просто замените, где они принадлежат в математике.Это будет выглядеть примерно так:
template<class T, unsigned M, unsigned N>
class Matrix {
private:
static const unsigned Row = M;
static const unsigned Col = N;
static const unsigned Size = Row * Col;
T data[Size] = {};
};
Теперь то, как вы их пометите, может зависеть от того, хотите ли вы Row-Col
мажор или Col-Row
мажор ...