Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
marphey
0 / 0 / 1
Регистрация: 18.04.2011
Сообщений: 11
#1

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

21.04.2011, 12:18. Просмотров 837. Ответов 14
Метки нет (Все метки)

Есть класс Array, в котором переопределены операторы (+, -, ==, != и т.д) для работы с матрицами.
Нужно так же переопределить оператор [][] или ()() для обращения к элементу матрицы напрямую.
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2011, 12:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Переопределение [][] или ()() для класса (C++):

Переопределение оператора () для своего класса
У меня вопрос. Как переопределить оператор () для своего класса?Если...

Переопределение класса
Пытаюсь создать приоритетную очередь на основе кучи, но не выходит. Не понимаю...

Переопределение класса вектор
Переопределите класс Vector, описывающий вектор в пространстве: а) двухместную...

Переопределение переменной класса-родителя
Есть базовый класс button_c и производный от него about_c. В about_c я...

Переопределение метода класса-шаблона
Привет народ. Есть такой код: typedef OS::process<OS::pr0, 90> TProc1;...

переопределение методов класса в массиве
Всем привет. У меня появилась проблема, которую я не могу решить. Казалось бы...

14
asics
Freelance
Эксперт С++
2854 / 1789 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
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;
}
1
marphey
0 / 0 / 1
Регистрация: 18.04.2011
Сообщений: 11
26.04.2011, 18:45  [ТС] #3
Спасибо Что-то особых отличий от своего кода я не выявил..
Перечитал лекции.
Оказалось, я что-то не так понял или препод не до конца разъяснил. Короче, немного меняется задача. Цитирую лекции:
В приведенной программе есть существенный недостаток: при об-
ращении к элементу-строке матрицы возвращается стандартный мас-
сив, а не объект матрица-строка. Поэтому в программе нельзя, напри-
мер, написать C[0] = A[2]*C или просто B[1]=D[3]*. Чтобы избавит-
ся от этого недостатка нужно, чтобы функция operator[] возвращала
значение типа Array. Если перегружать не операцию operator[], а
операцию operator(), то добиться этого будет легче.
Заранее спасибо
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
26.04.2011, 21:16 #4
Цитата Сообщение от marphey Посмотреть сообщение
Если перегружать не операцию operator[], а
операцию operator(), то добиться этого будет легче.
Спорно...
0
marphey
0 / 0 / 1
Регистрация: 18.04.2011
Сообщений: 11
26.04.2011, 23:48  [ТС] #5
Цитата Сообщение от silent_1991 Посмотреть сообщение
Спорно...
Почему?
Есть вообще какие-нибудь догадки как что-нибудь из этого сделать?
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
27.04.2011, 00:02 #6
Спорно потому, что реализация вообще ничем отличаться не будет, кроме сигнатуры.
Догадки следующие: матрицу делать не на основе обычного двумерного динамического массива, а на основе массива объектов, скажем, класса Vector (имеется ввиду самописный, алгебраический вектор, с соответствующими операциями), который основан на одномерном массиве. Тогда в Matrix надо перегрузить оператор [] так, чтобы он возвращал ссылку на Vector, а в Vector этот оператор перегрузить так, чтобы он уже ссылку на элемент возвращал. Тогда вызов [][] последовательно вернёт объект класса Vector (первые []), а затем уже элемент (вторые []).
Во всяком случае, я бы именно так делал.
Кстати, при таком представлении и с матрицами удобно работать (если перегружены операции с векторами, операции с матрицами на их основе реализуются куда проще).
1
marphey
0 / 0 / 1
Регистрация: 18.04.2011
Сообщений: 11
27.04.2011, 00:24  [ТС] #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
Спорно потому, что реализация вообще ничем отличаться не будет, кроме сигнатуры.
Догадки следующие: матрицу делать не на основе обычного двумерного динамического массива, а на основе массива объектов, скажем, класса Vector (имеется ввиду самописный, алгебраический вектор, с соответствующими операциями), который основан на одномерном массиве. Тогда в Matrix надо перегрузить оператор [] так, чтобы он возвращал ссылку на Vector, а в Vector этот оператор перегрузить так, чтобы он уже ссылку на элемент возвращал. Тогда вызов [][] последовательно вернёт объект класса Vector (первые []), а затем уже элемент (вторые []).
Во всяком случае, я бы именно так делал.
Кстати, при таком представлении и с матрицами удобно работать (если перегружены операции с векторами, операции с матрицами на их основе реализуются куда проще).
Большое спасибо
Хотя бы есть направление.
А насчет круглых скобок нет вариантов?
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
27.04.2011, 00:59 #8
marphey, Примерно такой же вариант насчет ().
1
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
27.04.2011, 01:07 #9
ForEveR, я бы сказал, точно такой же )))
1
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
27.04.2011, 01:20 #10
silent_1991, Ну да. Если бы требования были возврата именно элемента можно было бы перегрузить скобки с двумя параметрами. А так, только такой же, да
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
27.04.2011, 05:20 #11
Цитата Сообщение от marphey Посмотреть сообщение
Нужно так же переопределить оператор [][]
А такой разве есть?
C++
1
a=b+c+d; // здесь нет опреатора ++, как тебе могло показаться
Добавлено через 4 минуты
Цитата Сообщение от silent_1991 Посмотреть сообщение
Догадки следующие: матрицу делать не на основе обычного двумерного динамического массива, а на основе массива объектов, скажем, класса Vector (имеется ввиду самописный, алгебраический вектор, с соответствующими операциями), который основан на одномерном массиве. Тогда в Matrix надо перегрузить оператор [] так, чтобы он возвращал ссылку на Vector, а в Vector этот оператор перегрузить так, чтобы он уже ссылку на элемент возвращал. Тогда вызов [][] последовательно вернёт объект класса Vector (первые []), а затем уже элемент (вторые []).
Эйси, а тогда как разрешить менять рамеры самостоятельных массивов, но раздельное изменение размеров строк матрицы запретить (матрица должна быть строго прямоугольной)?
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
27.04.2011, 08:06 #12
taras atavin, возможно, сделать базовый класс, в котором определить всё, что можно, а ресайз сделать закрытым, и производный, в котором открыть ресайз. Матрицу сделать другом вектора и делать саму матрицу на основе базового класса с закрытым ресайзом.

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

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

Цитата Сообщение от taras atavin Посмотреть сообщение
Это существо бессовестно
Потому и поставил пару скобочек в конце)))
0
marphey
0 / 0 / 1
Регистрация: 18.04.2011
Сообщений: 11
27.04.2011, 12:25  [ТС] #15
Цитата Сообщение от taras atavin Посмотреть сообщение
А такой разве есть?
Возможно я неверно выразился в топе, но в последующих сообщениях и исправился и привел конкретную выдержку из задания.
0
27.04.2011, 12:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2011, 12:25
Привет! Вот еще темы с решениями:

Наследник класса, переопределение функции
Доброго времени суток! Есть не виртуальный класс, от него необходимо...

Переопределение оператора <<, класса ofstream
#ifndef COUT_RUS_H #define COUT_RUS_H #include &lt;iostream&gt; #include...

Переопределение БИНАРНОГО оператора внутри класса
Подскажите как правильно переопределить оператор + для сласса chislo. ...

Compiler Error C2365. Переопределение члена класса
C2365 жаль. Не знаю как исправить Error 198 error C2365: 'nan' :...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru