оператор []

Тема в разделе "Общие вопросы по С и С++", создана пользователем Slawutich, 7 май 2006.

Статус темы:
Закрыта.
  1. Slawutich

    Slawutich Гость

    Значит имеется класс с названием Матрица обрабатывает все возможные операции с двухмерными динамическими массивоми путем перегрузки операторов +,-,==,=, и т.д. подскажите как правильноперегрузить оператор []
    чтоб я мог сделать вот такое:

    Matrica a;
    cin>>a[3][1];
    cout<<a[3][1];



    коротко говоря обращаться к любой ячейки масива и производить туда запись или чтение
     
  2. Sliva

    Sliva Гость

    Вот так можно перегрузить [] один элемент - пробовала, работает :blink:

    template <class type> class Array // некий шаблон

    type & operator [] (int x) // переопределение операции [] {
    if ((x<0)||(x>=size))
    {
    cerr <<"Недопустимый индекс!!!";
    x = 0;
    }
    return massiv[x];
    }
    ;)
     
  3. Slawutich

    Slawutich Гость

    Как одномерный массив перегрузить я в курсе но мне надо оператор перегрузить так чтоб я мог пользоваться двухмерным массивом
     
  4. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Гм, вроде я сегодня уже отвечал. Можно из Матрица[] возвращать объект Строка, а уже Строка[] будет возвращать элемент матрицы. Тогда будет возможна запись Матрица[][]
     
  5. Гость

    прокси-объект?
    Код (Text):
    class matrix
    {
    private:
    class proxy
    {
    private:
    matrix& outer;
    unsigned int rows;
    public:
    proxy(matrix& obj_a, unsigned int obj_b)
    : outer(obj_a), rows(obj_b) {}
    int& operator[](unsigned int colums)
    {return outer.get(rows,colums);}
    };
    public:
    int& get(unsigned int rows, unsigned int colums) {...}
    proxy operator[](unsigned int rows)
    {return proxy(*this,rows);}
    ...
    };
     
  6. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Ну можно и так, если внутренняя структура матрицы не предусматривает объекты типа Строка\Столбец.
     
  7. Slawutich

    Slawutich Гость

    Я тут немного покумекал и вот к чему пришел

    Код (Text):
    class Matrica
    {
    private:
    int **d2array;
    int sizeX;
    int sizeY;
    public:

    Matrica(); //конструктор по умолчанию
    friend ostream& operator<<(ostream&, const Matrica&);//перегрузка ввывода
    friend istream& operator>>(istream&, Matrica&);//перегрузка ввода
    int* operator [](const int);//Перегрузка оператора []
    ~Matrica();//Деструктор
    };



    //Перегрузка оператора []
    int* Matrica::operator [](const int i)
    {
    return d2array[i];
    }


    void main()
    {

    Matrica a;
    a[1][3]=4;
    cout<<a[1][3];
    cin>>a[0][2];
    }
    И все прекрасно работает

    дело в том что если посмотреть на структуру динамического массива (см. картинку ниже) то получаеться что вертикальный столбец содержит указатели на начало горизонтальных вот и выходит что перегружаем сперва первые скобки находим нужный указатель потом сразу перегружаються вторые скобки и получаем указатель на требуемое значение и делаем с ним все что хотим.
    И всеравно всем спасибо :)
     

    Вложения:

    • 2d_array.JPG
      2d_array.JPG
      Размер файла:
      9,8 КБ
      Просмотров:
      70
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей