Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > перегрузка оператора []


Автор: smoke_man 24.9.2007, 22:19
Добрый вечер! Сталкнулся с такой проблемой: знаю как перегрузить оператор [] для одномерного массива - а как перегрузить его для 2-х мерного(3-х мерного), и вобще возможно ли это? Спасибо!

Автор: Daevaorn 24.9.2007, 22:22
Цитата(smoke_man @  24.9.2007,  23:19 Найти цитируемый пост)
а как перегрузить его для 2-х мерного(3-х мерного), и вобще возможно ли это? Спасибо! 

напрямую нельзя. можно сделать некую эмуляции этого через прокси классы. в интернете этот вопрос освещен достаточно хорошо. да и на форуме проскакивало не раз уже.

Автор: DjoNIK 24.9.2007, 22:23
Daevaorn дал дельный совет, я ошибался

Автор: smoke_man 24.9.2007, 22:36
Просто до этого использывал property(с++ builder) для доступа, но при использовании перегрузки операторов + и - компилятор выдает ошибку на эти свойства(Classes with properties cannot be copied by value).

Автор: EnergoHokum 25.9.2007, 15:51
У Элджера приводится такой пример:
Код

struct Index
{
    int x,y;
    Index(int ex,int why) : x(ex),y(why) {;}
    bool operator==(const Index& i) { return x == i.x && y == i.y; }
};

class WorkFine
{
public:
    Foo& operator[](Index& i);
};

array[Index(17,29)].MemberOfFoo();

Я сильно не разбирался, но должно работать вроде...

Автор: smoke_man 26.9.2007, 06:48
Все намного проще:
Код

template <class T> class TContainer
{
          public:
          T **data;
          int Size;
          int i;
          T & operator [](int j)
          {
                if(j<0||j>Size) throw;
                return data[i][j];
          }
};

template <class T> class TMatrix
{
           private:
           T **data;
           ........
           public:
           TMatrix(int x,int y)
          {
                     //Создается массив
                     //После создания и настройки
                     row.Size = y;
                     row.data = data; 
           }
           TContainer <T> row;
           TContainer & operator [] (int i)
           {
                  row.i = i;
                  return i;
           }
}



Может быть кому-нубудь это пригодится....

Автор: smoke_man 26.9.2007, 07:04
Только вот ошибочку нашел:
Код

TContainer & operator [] (int i)
{
      row.i = i;
      return row;
}

Тогда присоздании класса к элементу можно обращаться так:
Код

TMatrix <float> a(3,3);
a[0][0] = 0;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)