Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 1
Регистрация: 18.04.2011
Сообщений: 11
1

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

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

Author24 — интернет-сервис помощи студентам
Есть класс Array, в котором переопределены операторы (+, -, ==, != и т.д) для работы с матрицами.
Нужно так же переопределить оператор [][] или ()() для обращения к элементу матрицы напрямую.
Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.04.2011, 12:18
Ответы с готовыми решениями:

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

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

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

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

14
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 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
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
Эксперт С++
5057 / 3117 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
26.04.2011, 21:16 4
Цитата Сообщение от marphey Посмотреть сообщение
Если перегружать не операцию operator[], а
операцию operator(), то добиться этого будет легче.
Спорно...
0
0 / 0 / 1
Регистрация: 18.04.2011
Сообщений: 11
26.04.2011, 23:48  [ТС] 5
Цитата Сообщение от silent_1991 Посмотреть сообщение
Спорно...
Почему?
Есть вообще какие-нибудь догадки как что-нибудь из этого сделать?
0
Эксперт С++
5057 / 3117 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.04.2011, 00:02 6
Спорно потому, что реализация вообще ничем отличаться не будет, кроме сигнатуры.
Догадки следующие: матрицу делать не на основе обычного двумерного динамического массива, а на основе массива объектов, скажем, класса Vector (имеется ввиду самописный, алгебраический вектор, с соответствующими операциями), который основан на одномерном массиве. Тогда в Matrix надо перегрузить оператор [] так, чтобы он возвращал ссылку на Vector, а в Vector этот оператор перегрузить так, чтобы он уже ссылку на элемент возвращал. Тогда вызов [][] последовательно вернёт объект класса Vector (первые []), а затем уже элемент (вторые []).
Во всяком случае, я бы именно так делал.
Кстати, при таком представлении и с матрицами удобно работать (если перегружены операции с векторами, операции с матрицами на их основе реализуются куда проще).
1
0 / 0 / 1
Регистрация: 18.04.2011
Сообщений: 11
27.04.2011, 00:24  [ТС] 7
Цитата Сообщение от silent_1991 Посмотреть сообщение
Спорно потому, что реализация вообще ничем отличаться не будет, кроме сигнатуры.
Догадки следующие: матрицу делать не на основе обычного двумерного динамического массива, а на основе массива объектов, скажем, класса Vector (имеется ввиду самописный, алгебраический вектор, с соответствующими операциями), который основан на одномерном массиве. Тогда в Matrix надо перегрузить оператор [] так, чтобы он возвращал ссылку на Vector, а в Vector этот оператор перегрузить так, чтобы он уже ссылку на элемент возвращал. Тогда вызов [][] последовательно вернёт объект класса Vector (первые []), а затем уже элемент (вторые []).
Во всяком случае, я бы именно так делал.
Кстати, при таком представлении и с матрицами удобно работать (если перегружены операции с векторами, операции с матрицами на их основе реализуются куда проще).
Большое спасибо
Хотя бы есть направление.
А насчет круглых скобок нет вариантов?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.04.2011, 00:59 8
marphey, Примерно такой же вариант насчет ().
1
Эксперт С++
5057 / 3117 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.04.2011, 01:07 9
ForEveR, я бы сказал, точно такой же )))
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.04.2011, 01:20 10
silent_1991, Ну да. Если бы требования были возврата именно элемента можно было бы перегрузить скобки с двумя параметрами. А так, только такой же, да
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
27.04.2011, 05:20 11
Цитата Сообщение от marphey Посмотреть сообщение
Нужно так же переопределить оператор [][]
А такой разве есть?
C++
1
a=b+c+d; // здесь нет опреатора ++, как тебе могло показаться
Добавлено через 4 минуты
Цитата Сообщение от silent_1991 Посмотреть сообщение
Догадки следующие: матрицу делать не на основе обычного двумерного динамического массива, а на основе массива объектов, скажем, класса Vector (имеется ввиду самописный, алгебраический вектор, с соответствующими операциями), который основан на одномерном массиве. Тогда в Matrix надо перегрузить оператор [] так, чтобы он возвращал ссылку на Vector, а в Vector этот оператор перегрузить так, чтобы он уже ссылку на элемент возвращал. Тогда вызов [][] последовательно вернёт объект класса Vector (первые []), а затем уже элемент (вторые []).
Эйси, а тогда как разрешить менять рамеры самостоятельных массивов, но раздельное изменение размеров строк матрицы запретить (матрица должна быть строго прямоугольной)?
0
Эксперт С++
5057 / 3117 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.04.2011, 08:06 12
taras atavin, возможно, сделать базовый класс, в котором определить всё, что можно, а ресайз сделать закрытым, и производный, в котором открыть ресайз. Матрицу сделать другом вектора и делать саму матрицу на основе базового класса с закрытым ресайзом.

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

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

Цитата Сообщение от taras atavin Посмотреть сообщение
Это существо бессовестно
Потому и поставил пару скобочек в конце)))
0
0 / 0 / 1
Регистрация: 18.04.2011
Сообщений: 11
27.04.2011, 12:25  [ТС] 15
Цитата Сообщение от taras atavin Посмотреть сообщение
А такой разве есть?
Возможно я неверно выразился в топе, но в последующих сообщениях и исправился и привел конкретную выдержку из задания.
0
27.04.2011, 12:25
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.04.2011, 12:25
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
[Golang] 121. Best Time to Buy and Sell Stock
alhaos 28.01.2025
В этой задаче мы получаем слайс целых чисел, которые означают цену акции в разные моменты времени, и должны вернуть максимально возможную прибыль от купли продажи акции. / / . . .
Проектирование и моделирование
hw_wired 28.01.2025
Введение в моделирование Моделирование представляет собой один из фундаментальных методов научного познания, который позволяет изучать объекты и явления через создание их упрощенных аналогов. В. . .
Алгоритмы и исполнители
hw_wired 28.01.2025
Введение в алгоритмы В современном мире информационных технологий алгоритмы играют основополагающую роль в решении различных задач и автоматизации процессов. Алгоритм представляет собой точную. . .
Хранение информации
hw_wired 28.01.2025
Введение: Роль систем хранения информации в современном мире В современную эпоху цифровых технологий эффективное хранение информации становится одним из ключевых факторов успешного развития любой. . .
Обработка числовой информации
hw_wired 28.01.2025
Введение в обработку числовой информации В современном мире обработка числовой информации стала неотъемлемой частью как профессиональной деятельности, так и повседневной жизни. Электронные таблицы. . .
Мультимедиа
hw_wired 28.01.2025
Введение в мультимедийные технологии В современном мире мультимедийные технологии стали неотъемлемой частью нашей жизни, проникнув во все сферы человеческой деятельности. Термин "мультимедиа". . .
Обработка текстовой информации
hw_wired 28.01.2025
Введение в обработку текстовой информации В современном мире обработка текстовой информации играет фундаментальную роль в различных сферах человеческой деятельности. Текстовые редакторы стали. . .
Обработка графической информации
hw_wired 28.01.2025
Введение в компьютерную графику Компьютерная графика стала неотъемлемой частью современного цифрового мира, пройдя впечатляющий путь развития от простейших черно-белых изображений до сложных. . .
Python в Алгоритмике: Решение задач
hw_wired 28.01.2025
Введение в Python и Алгоритмику В современном мире программирование стало неотъемлемой частью образования и профессионального развития. Python зарекомендовал себя как один из самых популярных и. . .
Компьютер как универсальное устройство для работы с информацией
hw_wired 28.01.2025
Введение в устройство компьютера Компьютер представляет собой универсальное электронное устройство, предназначенное для автоматической обработки информации. В современном мире компьютер стал. . .
Информация и информационные процессы
hw_wired 28.01.2025
Понятие информации и ее виды В современном мире информация является одним из фундаментальных понятий, пронизывающих все сферы человеческой деятельности. Под информацией понимают любые сведения об. . .
Алгоритмика
hw_wired 28.01.2025
Введение: Основы алгоритмики и её роль в информатике В современном мире программирование и алгоритмическое мышление стали неотъемлемой частью образования и профессиональной деятельности. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru