Форум программистов, компьютерный форум CyberForum.ru

Переопределение [][] или ()() для класса - C++

Восстановить пароль Регистрация
 
marphey
0 / 0 / 0
Регистрация: 18.04.2011
Сообщений: 11
21.04.2011, 12:18     Переопределение [][] или ()() для класса #1
Есть класс Array, в котором переопределены операторы (+, -, ==, != и т.д) для работы с матрицами.
Нужно так же переопределить оператор [][] или ()() для обращения к элементу матрицы напрямую.
Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
21.04.2011, 15:41     Переопределение [][] или ()() для класса #2
Цитата Сообщение от marphey Посмотреть сообщение
переопределить оператор [][]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
 
class matrix{
private:
  int **data_;
  size_t cnt_row_, cnt_col_;
public:
  matrix(size_t cnt_row = 0, size_t cnt_col = 0) : cnt_row_(cnt_row), cnt_col_(cnt_col){
    data_= new int*[cnt_row_];
    for(size_t i = 0; i < cnt_row_; ++i){
      data_[i] = new int[cnt_col_];
      for(size_t j = 0; j < cnt_col_; ++j)
        data_[i][j] = 0;
    }
  }
  ~matrix(){
    for(size_t i = 0; i < cnt_row_; ++i)
      delete[] data_[i];
    delete[] data_;
  }
  int *operator[] (size_t idx){
    //if(idx >= cnt_row_)
      //error
    return data_[idx];
  }
};
 
int main(){
  matrix m(4, 5);
  for(size_t i = 0; i < 4; ++i){
    for(size_t j = 0; j < 5; ++j)
      std::cout << m[i][j] << ' ';
    std::cout << '\n';
  }
  return 0;
}
marphey
0 / 0 / 0
Регистрация: 18.04.2011
Сообщений: 11
26.04.2011, 18:45  [ТС]     Переопределение [][] или ()() для класса #3
Спасибо Что-то особых отличий от своего кода я не выявил..
Перечитал лекции.
Оказалось, я что-то не так понял или препод не до конца разъяснил. Короче, немного меняется задача. Цитирую лекции:
В приведенной программе есть существенный недостаток: при об-
ращении к элементу-строке матрицы возвращается стандартный мас-
сив, а не объект матрица-строка. Поэтому в программе нельзя, напри-
мер, написать C[0] = A[2]*C или просто B[1]=D[3]*. Чтобы избавит-
ся от этого недостатка нужно, чтобы функция operator[] возвращала
значение типа Array. Если перегружать не операцию operator[], а
операцию operator(), то добиться этого будет легче.
Заранее спасибо
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.04.2011, 21:16     Переопределение [][] или ()() для класса #4
Цитата Сообщение от marphey Посмотреть сообщение
Если перегружать не операцию operator[], а
операцию operator(), то добиться этого будет легче.
Спорно...
marphey
0 / 0 / 0
Регистрация: 18.04.2011
Сообщений: 11
26.04.2011, 23:48  [ТС]     Переопределение [][] или ()() для класса #5
Цитата Сообщение от silent_1991 Посмотреть сообщение
Спорно...
Почему?
Есть вообще какие-нибудь догадки как что-нибудь из этого сделать?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.04.2011, 00:02     Переопределение [][] или ()() для класса #6
Спорно потому, что реализация вообще ничем отличаться не будет, кроме сигнатуры.
Догадки следующие: матрицу делать не на основе обычного двумерного динамического массива, а на основе массива объектов, скажем, класса Vector (имеется ввиду самописный, алгебраический вектор, с соответствующими операциями), который основан на одномерном массиве. Тогда в Matrix надо перегрузить оператор [] так, чтобы он возвращал ссылку на Vector, а в Vector этот оператор перегрузить так, чтобы он уже ссылку на элемент возвращал. Тогда вызов [][] последовательно вернёт объект класса Vector (первые []), а затем уже элемент (вторые []).
Во всяком случае, я бы именно так делал.
Кстати, при таком представлении и с матрицами удобно работать (если перегружены операции с векторами, операции с матрицами на их основе реализуются куда проще).
marphey
0 / 0 / 0
Регистрация: 18.04.2011
Сообщений: 11
27.04.2011, 00:24  [ТС]     Переопределение [][] или ()() для класса #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
Спорно потому, что реализация вообще ничем отличаться не будет, кроме сигнатуры.
Догадки следующие: матрицу делать не на основе обычного двумерного динамического массива, а на основе массива объектов, скажем, класса Vector (имеется ввиду самописный, алгебраический вектор, с соответствующими операциями), который основан на одномерном массиве. Тогда в Matrix надо перегрузить оператор [] так, чтобы он возвращал ссылку на Vector, а в Vector этот оператор перегрузить так, чтобы он уже ссылку на элемент возвращал. Тогда вызов [][] последовательно вернёт объект класса Vector (первые []), а затем уже элемент (вторые []).
Во всяком случае, я бы именно так делал.
Кстати, при таком представлении и с матрицами удобно работать (если перегружены операции с векторами, операции с матрицами на их основе реализуются куда проще).
Большое спасибо
Хотя бы есть направление.
А насчет круглых скобок нет вариантов?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.04.2011, 00:59     Переопределение [][] или ()() для класса #8
marphey, Примерно такой же вариант насчет ().
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.04.2011, 01:07     Переопределение [][] или ()() для класса #9
ForEveR, я бы сказал, точно такой же )))
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.04.2011, 01:20     Переопределение [][] или ()() для класса #10
silent_1991, Ну да. Если бы требования были возврата именно элемента можно было бы перегрузить скобки с двумя параметрами. А так, только такой же, да
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.04.2011, 05:20     Переопределение [][] или ()() для класса #11
Цитата Сообщение от marphey Посмотреть сообщение
Нужно так же переопределить оператор [][]
А такой разве есть?
C++
1
a=b+c+d; // здесь нет опреатора ++, как тебе могло показаться
Добавлено через 4 минуты
Цитата Сообщение от silent_1991 Посмотреть сообщение
Догадки следующие: матрицу делать не на основе обычного двумерного динамического массива, а на основе массива объектов, скажем, класса Vector (имеется ввиду самописный, алгебраический вектор, с соответствующими операциями), который основан на одномерном массиве. Тогда в Matrix надо перегрузить оператор [] так, чтобы он возвращал ссылку на Vector, а в Vector этот оператор перегрузить так, чтобы он уже ссылку на элемент возвращал. Тогда вызов [][] последовательно вернёт объект класса Vector (первые []), а затем уже элемент (вторые []).
Эйси, а тогда как разрешить менять рамеры самостоятельных массивов, но раздельное изменение размеров строк матрицы запретить (матрица должна быть строго прямоугольной)?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.04.2011, 08:06     Переопределение [][] или ()() для класса #12
taras atavin, возможно, сделать базовый класс, в котором определить всё, что можно, а ресайз сделать закрытым, и производный, в котором открыть ресайз. Матрицу сделать другом вектора и делать саму матрицу на основе базового класса с закрытым ресайзом.

Добавлено через 51 секунду
А можно положиться на совесть пользователя))
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.04.2011, 08:14     Переопределение [][] или ()() для класса #13
Цитата Сообщение от silent_1991 Посмотреть сообщение
Матрицу сделать другом вектора и делать саму матрицу на основе базового класса с закрытым ресайзом.
Зачем другом? Тогда уж лучше пусть внутри в матрице валяются строки с открытым ресайзом, а [] приводит тип к базовому классу вообще без ресайза. И по аналогии расширять на трёхмерный случай.

Добавлено через 1 минуту
Цитата Сообщение от silent_1991 Посмотреть сообщение
А можно положиться на совесть пользователя))
Это существо бессовестно на столько, что умудряется ставить задержку и период автоповтора на 0 и ругать программистов, если не читается дискета.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.04.2011, 08:43     Переопределение [][] или ()() для класса #14
Цитата Сообщение от taras atavin Посмотреть сообщение
Тогда уж лучше пусть внутри в матрице валяются строки с открытым ресайзом, а [] приводит тип к базовому классу вообще без ресайза
Можно и так.

Цитата Сообщение от taras atavin Посмотреть сообщение
Это существо бессовестно
Потому и поставил пару скобочек в конце)))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2011, 12:25     Переопределение [][] или ()() для класса
Еще ссылки по теме:

переопределение оператора <<, класса ofstream C++
Переопределение метода класса-шаблона C++
C++ Compiler Error C2365. Переопределение члена класса

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
marphey
0 / 0 / 0
Регистрация: 18.04.2011
Сообщений: 11
27.04.2011, 12:25  [ТС]     Переопределение [][] или ()() для класса #15
Цитата Сообщение от taras atavin Посмотреть сообщение
А такой разве есть?
Возможно я неверно выразился в топе, но в последующих сообщениях и исправился и привел конкретную выдержку из задания.
Yandex
Объявления
27.04.2011, 12:25     Переопределение [][] или ()() для класса
Ответ Создать тему
Опции темы

Текущее время: 23:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru