Невозможно преобразовать int * в int ** в присваивании в C ++

0

Я начинаю с C++, поэтому начал немного попрактиковаться, написав свой собственный класс Vector. Он хранит количество строк и столбцов массива, а элементы динамически распределены.

template <class T> 
class Vector {
    private:
        unsigned int rows;
        unsigned int cols;
        T **elements;
    public:
        Vector(unsigned int, unsigned int);
        ~Vector();
};

template <class T>
Vector<T>::Vector(unsigned int rows, unsigned int cols) {
    this->rows = rows;
    this->cols = cols;

    this->elements = new T[this->rows];
    for (int i = 0; i < this->rows; i++) {
        this->elements[i] = new T[this->cols];
    }
}

template <class T>
Vector<T>::~Vector() {
};

Вот код. Когда я его скомпилирую (я создаю объект для его проверки: Vector<int> test;), я получаю сообщение об ошибке: "Cannot convert 'int* to 'int** in assignment".

Почему я получаю эту ошибку? Я видел многомерный пример динамического размещения в Интернете: http://www.cplusplus.com/forum/beginner/63/

  • 0
    new T[size] возвращает T* . elements T** .
  • 4
    Прочитайте ту ссылку, на которую вы указываете внимательно. Вы пропускаете * где-то в первом new выражении. (И называть эту вещь вектором - очень странный выбор. Векторы имеют одно измерение, вы строите матрицу.)
Показать ещё 8 комментариев
Теги:
class
arrays
templates
dynamic-memory-allocation

1 ответ

2

Самая большая ошибка заключается в том, что вам не хватает " * " при распределении массива указателей:

this->elements = new T*[this->rows];

Помимо этого:

  1. Почему вы определяете вектор как матрицу с строками и столбцами?
  2. Свободная память после того, как вы выделили и использовали, когда она больше не нужна
  3. Должны быть доступны аксессоры

в качестве отправной точки возьмите следующий код:

template <class T> 
class Vector {
    public:
        unsigned int rows;
        unsigned int cols;
        T** elements;
        Vector(unsigned int, unsigned int);
        ~Vector();
};

template <class T>
Vector<T>::Vector(unsigned int rows, unsigned int cols) {
    this->rows = rows;
    this->cols = cols;

    this->elements = new T*[this->rows];
    for (int i = 0; i < this->rows; i++) {
        this->elements[i] = new T[this->cols];
    }
}

template <class T>
Vector<T>::~Vector() {
    for(int i=0; i<this->rows;++i)
        delete[] this->elements[i];
    delete[] this->elements;
};


int main()
{
    Vector<int> obj(2,2);
    obj.elements[0][0] = 1;
    obj.elements[0][1] = 2;
    obj.elements[1][0] = 3;
    obj.elements[1][1] = 4;

    std::cout << obj.elements[0][0] << " " << obj.elements[0][1] << std::endl;
    std::cout << obj.elements[1][0] << " " << obj.elements[1][1] << std::endl;

    return 0;
}

Example

Ещё вопросы

Сообщество Overcoder
Наверх
Меню