Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
marphey
0 / 0 / 0
Регистрация: 18.04.2011
Сообщений: 11
#1

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

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

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

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

Переопределение класса - C++
Пытаюсь создать приоритетную очередь на основе кучи, но не выходит. Не понимаю почему, выскакивает куча ошибок, в том числе эти: ...

Переопределение класса вектор - C++
Переопределите класс Vector, описывающий вектор в пространстве: а) двухместную операцию сложения векторов (+), возвращающую свой...

Переопределение оператора <<, класса ofstream - C++
#ifndef COUT_RUS_H #define COUT_RUS_H #include &lt;iostream&gt; #include &lt;windows.h&gt; namespace rus { class Ccout { ...

Переопределение метода класса-шаблона - C++
Привет народ. Есть такой код: typedef OS::process&lt;OS::pr0, 90&gt; TProc1; TProc1 Proc1; template&lt;&gt; void Proc1::exec() { //тут...

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

14
asics
Freelance
Эксперт С++
2848 / 1783 / 144
Регистрация: 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 / 0
Регистрация: 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
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
26.04.2011, 21:16 #4
Цитата Сообщение от marphey Посмотреть сообщение
Если перегружать не операцию operator[], а
операцию operator(), то добиться этого будет легче.
Спорно...
0
marphey
0 / 0 / 0
Регистрация: 18.04.2011
Сообщений: 11
26.04.2011, 23:48  [ТС] #5
Цитата Сообщение от silent_1991 Посмотреть сообщение
Спорно...
Почему?
Есть вообще какие-нибудь догадки как что-нибудь из этого сделать?
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
27.04.2011, 00:02 #6
Спорно потому, что реализация вообще ничем отличаться не будет, кроме сигнатуры.
Догадки следующие: матрицу делать не на основе обычного двумерного динамического массива, а на основе массива объектов, скажем, класса Vector (имеется ввиду самописный, алгебраический вектор, с соответствующими операциями), который основан на одномерном массиве. Тогда в Matrix надо перегрузить оператор [] так, чтобы он возвращал ссылку на Vector, а в Vector этот оператор перегрузить так, чтобы он уже ссылку на элемент возвращал. Тогда вызов [][] последовательно вернёт объект класса Vector (первые []), а затем уже элемент (вторые []).
Во всяком случае, я бы именно так делал.
Кстати, при таком представлении и с матрицами удобно работать (если перегружены операции с векторами, операции с матрицами на их основе реализуются куда проще).
1
marphey
0 / 0 / 0
Регистрация: 18.04.2011
Сообщений: 11
27.04.2011, 00:24  [ТС] #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
Спорно потому, что реализация вообще ничем отличаться не будет, кроме сигнатуры.
Догадки следующие: матрицу делать не на основе обычного двумерного динамического массива, а на основе массива объектов, скажем, класса Vector (имеется ввиду самописный, алгебраический вектор, с соответствующими операциями), который основан на одномерном массиве. Тогда в Matrix надо перегрузить оператор [] так, чтобы он возвращал ссылку на Vector, а в Vector этот оператор перегрузить так, чтобы он уже ссылку на элемент возвращал. Тогда вызов [][] последовательно вернёт объект класса Vector (первые []), а затем уже элемент (вторые []).
Во всяком случае, я бы именно так делал.
Кстати, при таком представлении и с матрицами удобно работать (если перегружены операции с векторами, операции с матрицами на их основе реализуются куда проще).
Большое спасибо
Хотя бы есть направление.
А насчет круглых скобок нет вариантов?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
27.04.2011, 00:59 #8
marphey, Примерно такой же вариант насчет ().
1
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
27.04.2011, 01:07 #9
ForEveR, я бы сказал, точно такой же )))
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
27.04.2011, 01:20 #10
silent_1991, Ну да. Если бы требования были возврата именно элемента можно было бы перегрузить скобки с двумя параметрами. А так, только такой же, да
0
taras atavin
3570 / 1753 / 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 (первые []), а затем уже элемент (вторые []).
Эйси, а тогда как разрешить менять рамеры самостоятельных массивов, но раздельное изменение размеров строк матрицы запретить (матрица должна быть строго прямоугольной)?
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
27.04.2011, 08:06 #12
taras atavin, возможно, сделать базовый класс, в котором определить всё, что можно, а ресайз сделать закрытым, и производный, в котором открыть ресайз. Матрицу сделать другом вектора и делать саму матрицу на основе базового класса с закрытым ресайзом.

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

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

Цитата Сообщение от taras atavin Посмотреть сообщение
Это существо бессовестно
Потому и поставил пару скобочек в конце)))
0
marphey
0 / 0 / 0
Регистрация: 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
Привет! Вот еще темы с ответами:

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

Переопределение переменной класса-родителя - C++
Есть базовый класс button_c и производный от него about_c. В about_c я попытался переопределить значения переменных w, h, dir, dir_h, но...

Переопределение БИНАРНОГО оператора внутри класса - C++
Подскажите как правильно переопределить оператор + для сласса chislo. class chislo { int val; chislo chislo::operator +(const...

Compiler Error C2365. Переопределение члена класса - C++
C2365 жаль. Не знаю как исправить Error 198 error C2365: 'nan' : redefinition; previous definition was...


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

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

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