Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2012, 14:50   #1
Slippy
Пользователь
 
Аватар для Slippy
 
Регистрация: 29.12.2010
Сообщений: 55
По умолчанию доступ к элементам массива внутри класса по индексам

Такой вопрос.
В C# можно организовывать индексный доступ к элементам массива, являющегося полем класса, следующим образом:

Код:
public class MyClass
{       
        double[][] arrayField;

        public double this[int x, int y]
        {
            get
            {
                return this.arrayField[x, y];
            }
            set
            {
                this.arrayField[x, y] = value;
            }
        }
}
После чего можно обращаться к элементам arrayField прямо через экземпляр класса:

Код:
MyClass myclass = new MyClass();
myclass[i, j] = ..... ;
Есть ли подобная синтаксическая плюшка в С++?
Заранее спасибо.
Теория – это когда все известно, но ничего не работает. Практика – это когда все работает, но никто не знает почему. Мы объединяем теорию и практику: ничего не работает и никто не знает почему ©
Slippy вне форума Ответить с цитированием
Старый 12.02.2012, 15:03   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

естественно есть.
смотрите в сторону перегрузки оператора []
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.02.2012, 20:23   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Slippy, попробуем разобраться.

Парни, давно у меня назрел вопрос. Встречал в книге Крупника "Изучаем С++" следующий код (matrix.h). Для обращения к "элементам массива" используется оператор (), а нужно [].

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

Цитата:
error C2333: matrix :: operator []: ошибка в объявлении функции; пропуск основного текста функции
error C2676: бинарный '[': 'matrix' не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
. . .
matrix.h
Код:
class matrix
{
public:
    matrix(int r=2,int c=2) {
        nrows = r;
        ncols = c;
        m = new double[r*c];
    }
    matrix(matrix &mc) {
        nrows = mc.rget();
        ncols = mc.cget();
        m = new double[nrows*ncols];
        for(int i = 0; i < nrows; i++) {
            for(int j=0; j < ncols; j++) {
                m[i*ncols+j] = mc(i, j);
            }
        }
    }
    ~matrix() {
        delete [] m;
    }
    double & operator()(int r,int c) {
        return m[r*ncols+c];
    }
    matrix & operator=(matrix &mc) {
        if (this != &mc) {
            delete [] m;
            nrows = mc.rget();
            ncols = mc.cget();
            m = new double [nrows*ncols];
            for (int i = 0; i < nrows; i++) {
                for (int j = 0; j < nrows; j++) {
                    m[i*ncols+j] = mc(i, j);
                }
            }
        }
        return *this;
    }
    int rget() {
        return nrows;
    }
    int cget() {
        return ncols;
    }
private:
    int nrows;
    int ncols;
    double *m;
};
main.cpp
Код:
#include <iostream>
#include "matrix.h"
using namespace std;

#define NROW 10
#define NCOL 10

int main()
{
    matrix arr(NROW, NCOL);

    // инициализируем массив
    for (int i = 0; i < arr.rget(); i++) {
        for (int j = 0; j < arr.cget(); j++) {
            arr(i, j) = i*j;
        }
    }

    // выводим массив на экран
    for (int i = 0; i < arr.rget(); i++) {
        for (int j = 0; j < arr.cget(); j++) {
            cout << arr(i, j) << '\t';
        }
        cout << endl;
    }

    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 12.02.2012, 20:38   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а там нельзя определять двухиндексную систему если не ошибаюсь.
то есть нужен будет обьект строка матрицы.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.02.2012, 21:18   #5
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Slippy, попробуем разобраться.

Парни, давно у меня назрел вопрос. Встречал в книге Крупника "Изучаем С++" следующий код (matrix.h). Для обращения к "элементам массива" используется оператор (), а нужно [].

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

Оператор инлексирования должен иметь ровно один параметр.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 12.02.2012, 21:53   #6
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Уже почти час сижу удаляю и переписываю по десять раз вопросы. Запутался что-то. Оставил один вопрос: как быть?

Извините парни, не смог я понять ничего из того, что вы мне написали. Но зато примерно понял "куда танцевать" (это тоже немало, спасибо). Как разберусь - отпишусь!

Последний раз редактировалось 8Observer8; 12.02.2012 в 21:57.
8Observer8 вне форума Ответить с цитированием
Старый 13.02.2012, 05:50   #7
Slippy
Пользователь
 
Аватар для Slippy
 
Регистрация: 29.12.2010
Сообщений: 55
По умолчанию

Получается, если индекс 1 - то просто переопределяем [].
А вот если более одного?

Цитата:
то есть нужен будет обьект строка матрицы.
т.е. внутри класса "матрица" у нас одномерный массив объектов класса "строка матрицы", и в этом классе строки тоже переопределяем оператор [], я правильно понял?
Теория – это когда все известно, но ничего не работает. Практика – это когда все работает, но никто не знает почему. Мы объединяем теорию и практику: ничего не работает и никто не знает почему ©
Slippy вне форума Ответить с цитированием
Старый 13.02.2012, 08:28   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
т.е. внутри класса "матрица" у нас одномерный массив объектов класса "строка матрицы", и в этом классе строки тоже переопределяем оператор [], я правильно понял?
ну примерно так.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступ к элементам MozillaWindowClass Gangsta15 Общие вопросы Delphi 3 08.11.2015 13:51
QListView - доступ к элементам списка Krater Qt и кроссплатформенное программирование С/С++ 1 23.10.2011 13:36
к элементам первой половины массива добавить минимум, а к элементам второй - добавить максимум specialist Паскаль, Turbo Pascal, PascalABC.NET 3 08.05.2011 01:46
доступ к элементам вложенных структур tormozina Общие вопросы C/C++ 2 17.03.2011 21:39
Наследование доступ к элементам. Lazio Общие вопросы C/C++ 1 20.04.2010 22:52