Вам необходимо правильно узнать о массивах и указателях. Это включает в себя урок: «Да, они не так полезны, как я думал». После того, как вы знакомы с тем, как работают массивы и указатели, вы должны пересмотреть свой дизайн.
К примеру, на мой взгляд, следующая конструкция имеет много преимуществ:
#ifndef MATRIX_HPP_INCLUDED
#define MATRIX_HPP_INCLUDED
#include <vector>
#include <algorithm>
class matrix
{
public:
typedef std::vector<double>::size_type st;
matrix() : rows_(0), cols_(0) {}
matrix(int r, int c) : rows_(r), cols_(c), coeffs_(st(r)*c,0.0) {}
void reset(int r, int c)
{ rows_=r; cols_=c; coeffs_.clear(); coeffs_.resize(st(r)*c,0.0); }
int rows() const {return rows_;}
int cols() const {return cols_;}
double const& operator()(int i, int j) const {return coeffs_[indexof(i,j)];}
double & operator()(int i, int j) {return coeffs_[indexof(i,j)];}
double const* operator[](int i) const {return &coeffs_[indexof(i,0)];}
double * operator[](int i) {return &coeffs_[indexof(i,0)];}
void swap(matrix& that)
{
std::swap(this->rows_,that.rows_);
std::swap(this->cols_,that.cols_);
this->coeffs_.swap(that.coeffs_));
}
private:
int rows_, cols_;
std::vector<double> coeffs_;
st indexof(int i, int j) const {return st(i)*cols+j;} // row major storage
};
inline void swap(matrix& a, matrix& b) {a.swap(b);}
matrix& operator+=(matrix& lhs, matrix const& rhs);
matrix operator+(matrix const& lhs, matrix const& rhs);
matrix operator*(matrix const& lhs, matrix const& rhs);
inline matrix& operator*=(matrix& lhs, matrix const& rhs)
{ matrix tmp = lhs * rhs; swap(tmp,lhs); return lhs; }
...
#endif
Таким образом, вы не будете тратить любое пространство для маленьких матриц, и вы можете поддерживать большие матрицы. Кроме того, использование std :: vector вместо элемента указателя, указывающего на динамически выделенную память, устраняет необходимость в определении собственного конструктора копирования, оператора присваивания и деструктора.
Конечно, вы можете использовать boost :: multi_array в качестве замены матрицы, но с помощью пользовательского класса matrix вы можете объявлять перегруженные операторы в своем собственном пространстве имен, что желательно из-за ADL (зависимого от аргумента поиска).
Возможно, вы думаете, что это не отвечает на ваш вопрос. В этом случае позвольте мне подчеркнуть, что, я думаю, вы не совсем понимаете, как работают и ведут себя массивы и указатели. Это то, что вы должны искать в приличной книге на C++. Можно было написать много страниц по этой теме. Вы не можете ожидать краткий ответ, объясняющий все причуды.
Проверьте резьбу Definite C++ Book Guide.
Пока код, который вы представляете, недопустим, C++, не полагайтесь на Intellisense для поиска синтаксических ошибок. Intellisense - это инструмент автозаполнения, а не средство проверки синтаксиса. Он только «быстро смотрит» на ваш код и не может давать наиболее точные сообщения об ошибках. Вместо этого вы должны попытаться скомпилировать его (с фактическим компилятором, конечно) и опубликовать фактическое сообщение об ошибке компилятора (ов), если оно есть. –
Я уверен, что вокруг этого много дубликатов и вопросов. Найдите в поле выше для '[C++] двумерный массив или аналогичный и перейдите по различным вопросам/ответам. Даже если они не совсем то же самое, они, несомненно, предоставят некоторое представление. –