#c #arrays
#c #массивы
Вопрос:
У меня есть следующий код:
#include <iostream>
#include <string>
using namespace std;
class Vector {
public:
double *array;
int width;
Vector (int width) {
array = new double[width];
this->width = width;
}
doubleamp; operator[] (int x) {
return this->array[x];
}
};
class Matrix {
public:
double *array;
int height;
int width;
Matrix (int height, int width) {
array = new double[height * width];
this->height = height;
this->width = width;
}
Vectoramp; operator[] (int x) {
Vector v = Vector(this->width);
for (int i = 0; i < this->width; i ) {
// ERROR!
amp;(v.array i) = amp;this->array[x * this->height i];
}
return v;
}
};
int main() {
// vec
Vector vec = Vector(2);
vec[0] = 2;
cout<<vec.array[0]<<endl; // Prints 2, Correct
// mat
Matrix mat = Matrix(3,2);
mat[2][0] = 4;
cout<<mat.array[6]<<endl; // Must be 4
// 6 = y * height x
// 6 = 2 * 3 0
// 6 = 6
}
Я хочу инициализировать массив указателей, затем установить один из элементов массива на другой указатель (это показано в моем классе matrix в operator[]
). Я хочу сделать это, потому что это устраняет необходимость написания строк кода, подобных этому : mat.array[...]
. Я бы предпочел использовать mat[...][...]
.
Я попытался объявить свою array
переменную в своем Vector
классе в качестве ссылки : double amp;array;
. К сожалению, я не могу этого сделать, потому что моя array
переменная зависит от параметра в конструкторе int width
.
Как я могу это сделать?
Комментарии:
1. Ваш класс matrix должен содержать «Векторный * массив;» вместо «двойного * массива;»
2. Это халтурно, но самым простым решением было
operator[]
бы вернутьdouble*
и просто вернутьarray x*width
, таким образом, вы сможете использоватьmat[x][y]
. Или вам нужно будет создать класс, который будет представлять собой представление данных, не владея им (вашVector
владеет его данными).3. @Yksisarvinen хорошее предложение, но, допустим, я хочу запустить код
a[3] = {2,3,4}
, гдеa
есть матрица. Я не могу этого сделать, если не объявлю operator= в классе double , используяextension
ключевое слово. Я хочу воздержаться от этого, потому что это уже объявлено в моемVector
классе4. Однако @SvenNilsson выдвинул отличное предложение, и, честно говоря, я не могу поверить, что не подумал об этом раньше! Это не только решит мою проблему, но и сделает разработку класса Matrix намного более плавной. Спасибо вам обоим за потраченное время.
Ответ №1:
Из того, что я понимаю, вы просто хотите получить доступ к элементам matrix как martrix[a][b], а не matrix.array[a] .
Во-первых, ваш operator[]()
неэффективен.
-
Он не сможет обрабатывать случаи матрицы с шириной, отличной от 2.
Чтобы исправить это, вам необходимо изменить
Vector v = new Vector(2);
Для
Vector v = new Vector(width);
-
Вы создаете новый вектор каждый раз, когда вызывается оператор.
Вместо этого вы можете следовать приведенному ниже предложению.
-
Измените
double* array
в классе Matrix наVector* array
-
Матричный конструктор для
Matrix(int _height , int _width) : height(_height), width(_width) { array = new Vector[height]; // new Vector(width)[height] does not work. Someone, please check. Till then give a default value in Vector constructor to make that work for(int i=0;i<height; i) { array[i] = Vector(width); } }
-
operator[]()
в классе Matrix дляVectoramp; operator[](int x) { return array[x]; }
Комментарии:
1.
Vector v = new Vector(width)
Сейчас я обновлю, спасибо, что заметили это.