Не могу перегрузить оператор присваивания = в производном классе (как хочу); вызов из основных переходов к методу операт ⇐ C++
Не могу перегрузить оператор присваивания = в производном классе (как хочу); вызов из основных переходов к методу операт
Я пытаюсь реализовать класс для матрицы со всеми обычными операциями, просто в качестве упражнения. Я реализовал общие операции (+, -, ·), но моя проблема возникла, когда я попытался реализовать операции нарезки — аналогично Numpy. Например, если я хочу сделать что-то вроде a[2:5,1:3] = b[10:13, 10:12], я пришел к выводу, что мне понадобится какой-то «умный итератор» ' (я не знаю технического названия), которые определяют, как переместить одну строку вниз. У меня есть два класса:
[*]MatrixIterator: базовый класс с указателем и индексами на подматрицу, которую они представляют (может быть всей матрицей). [*]Matrix: производный класс от MatrixIterator, у которого унаследованы почти те же операторы, с той разницей, что в конструкторе и деконструкторе выделяется и освобождается часть память, содержащая матричный массив.
Проблема возникла, когда я понял, что оператор присваивания = должен быть разным для обоих классов. Потому что если я хочу сделать что-то вроде a = b, мне нужно просто уничтожить выделенный массив в a и выполнить «повторную инициализацию» с данными >b (в случае изменения размеров); что, как я понял, нужно делать «вручную». Но с a[2:5,1:3] = b[10:13, 10:12] я просто присваиваю элемент элементу без «повторной инициализации».
В итоге у меня получилось (извините, если слишком длинно, но думаю, это легко понять):
Файл Matrix.h
#pragma один раз #include #include //Базовый класс шаблон класс MatrixIterator { публика: МатрицаИтератор(); MatrixIterator(T* start, size_t M, size_t N, size_t m, size_t n); Т* начало() константа; size_t getHeight() const; size_t getWidth() const; size_t getM() const; size_t getN() const; size_t last_idx() const; MatrixIterator& оператор=(const MatrixIterator& b); защищено: Т *арр; размер_т М; //ранги (полной матрицы) size_t Н; //столбцы (полной матрицы) size_t м; //ранги size_t н; //столбцы size_t i_end; //последний индекс }; //Производный класс шаблон класс Matrix: public MatrixIterator { используя базу = MatrixIterator; публика: Матрица(); Matrix(T *array, size_t высота, size_t ширина); ~Матрица(); Матрица& оператор=(const MatrixIterator& b); //проблемный метод }; шаблон MatrixIterator::MatrixIterator() { обр = NULL; М = 0; Н = 0; м = 0; п = 0; я_конец = 0; } //Методы базового класса шаблон MatrixIterator::MatrixIterator(T* arr, size_t M, size_t N, size_t m, size_t n) { это->arr = arr; это->М = М; это->N = N; это->м = м; это->n = n; this->i_end = N*(m-1)+ n; } шаблон T* MatrixIterator::begin() const { возврат обр; } шаблон size_t MatrixIterator::getHeight() const { вернуть м; } шаблон size_t MatrixIterator::getWidth() const { вернуть н; } шаблон size_t MatrixIterator::getM() const { вернуть М; } шаблон size_t MatrixIterator::getN() const { вернуть Н; } шаблон size_t MatrixIterator::last_idx() const { вернуть i_end; } //строка 'c=a' переходит сюда вместо перехода к методу производного класса шаблон MatrixIterator& MatrixIterator::operator=(const MatrixIterator& b) { Assert(m == b.getHeight() && n == b.getWidth()); автоматический бит = b.begin(); size_t N2 = b.getN(); for (size_t i=0, i2=0; i
Я пытаюсь реализовать класс для матрицы со всеми обычными операциями, просто в качестве упражнения. Я реализовал общие операции (+, -, ·), но моя проблема возникла, когда я попытался реализовать операции нарезки — аналогично Numpy. Например, если я хочу сделать что-то вроде a[2:5,1:3] = b[10:13, 10:12], я пришел к выводу, что мне понадобится какой-то «умный итератор» ' (я не знаю технического названия), которые определяют, как переместить одну строку вниз. У меня есть два класса:
[*]MatrixIterator: базовый класс с указателем и индексами на подматрицу, которую они представляют (может быть всей матрицей). [*]Matrix: производный класс от MatrixIterator, у которого унаследованы почти те же операторы, с той разницей, что в конструкторе и деконструкторе выделяется и освобождается часть память, содержащая матричный массив.
Проблема возникла, когда я понял, что оператор присваивания = должен быть разным для обоих классов. Потому что если я хочу сделать что-то вроде a = b, мне нужно просто уничтожить выделенный массив в a и выполнить «повторную инициализацию» с данными >b (в случае изменения размеров); что, как я понял, нужно делать «вручную». Но с a[2:5,1:3] = b[10:13, 10:12] я просто присваиваю элемент элементу без «повторной инициализации».
В итоге у меня получилось (извините, если слишком длинно, но думаю, это легко понять):
Файл Matrix.h
#pragma один раз #include #include //Базовый класс шаблон класс MatrixIterator { публика: МатрицаИтератор(); MatrixIterator(T* start, size_t M, size_t N, size_t m, size_t n); Т* начало() константа; size_t getHeight() const; size_t getWidth() const; size_t getM() const; size_t getN() const; size_t last_idx() const; MatrixIterator& оператор=(const MatrixIterator& b); защищено: Т *арр; размер_т М; //ранги (полной матрицы) size_t Н; //столбцы (полной матрицы) size_t м; //ранги size_t н; //столбцы size_t i_end; //последний индекс }; //Производный класс шаблон класс Matrix: public MatrixIterator { используя базу = MatrixIterator; публика: Матрица(); Matrix(T *array, size_t высота, size_t ширина); ~Матрица(); Матрица& оператор=(const MatrixIterator& b); //проблемный метод }; шаблон MatrixIterator::MatrixIterator() { обр = NULL; М = 0; Н = 0; м = 0; п = 0; я_конец = 0; } //Методы базового класса шаблон MatrixIterator::MatrixIterator(T* arr, size_t M, size_t N, size_t m, size_t n) { это->arr = arr; это->М = М; это->N = N; это->м = м; это->n = n; this->i_end = N*(m-1)+ n; } шаблон T* MatrixIterator::begin() const { возврат обр; } шаблон size_t MatrixIterator::getHeight() const { вернуть м; } шаблон size_t MatrixIterator::getWidth() const { вернуть н; } шаблон size_t MatrixIterator::getM() const { вернуть М; } шаблон size_t MatrixIterator::getN() const { вернуть Н; } шаблон size_t MatrixIterator::last_idx() const { вернуть i_end; } //строка 'c=a' переходит сюда вместо перехода к методу производного класса шаблон MatrixIterator& MatrixIterator::operator=(const MatrixIterator& b) { Assert(m == b.getHeight() && n == b.getWidth()); автоматический бит = b.begin(); size_t N2 = b.getN(); for (size_t i=0, i2=0; i
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как создать словарь объединенных переходов DFA на основе переходов DFA1 и DFA2
Anonymous » » в форуме Python - 0 Ответы
- 20 Просмотры
-
Последнее сообщение Anonymous
-