Установка элемента массива указателей на указатель в C

#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[]() неэффективен.

  1. Он не сможет обрабатывать случаи матрицы с шириной, отличной от 2.

    Чтобы исправить это, вам необходимо изменить

    Vector v = new Vector(2);

    Для

    Vector v = new Vector(width);

  2. Вы создаете новый вектор каждый раз, когда вызывается оператор.

Вместо этого вы можете следовать приведенному ниже предложению.

  1. Измените double* array в классе Matrix на Vector* array

  2. Матричный конструктор для

     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);
         }
     }
      
  3. operator[]() в классе Matrix для

     Vectoramp; operator[](int x) {
        return array[x];
    }
      

Комментарии:

1. Vector v = new Vector(width) Сейчас я обновлю, спасибо, что заметили это.