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


Автор: Guest_Andrei 22.5.2003, 23:22
У меня есть класс где данные хранятся в линейном массиве.

Я хотелбы с помощью перегрузки оператора (наверное это должен быть operator[]) обращаться к классу как к двух-мерному массиву (object[][]). Как сделать эту перегрузку?

Меня интересует сам синтаксис.

Спасибо огромное тому кто может помочь!



Автор: man2002ua 23.5.2003, 09:44
А почему двумерному и что будет в качестве измерений массива. И размерность массива?

Автор: setq 23.5.2003, 11:18
может быть так




#define ROWSIZE 10
#define COLSIZE 15


class my_class
{
int array [COLSIZE * ROWSIZE], *pointer;

public:

my_class& operator [] (int n)
{
static bool is_firstcall = true;

if (is_firstcall)
pointer = array + n * ROWSIZE;
else
pointer += n;

is_firstcall = ! is_firstcall;
return *this;
}

operator int () {return *pointer;}

void operator = (int n)
{
if (pointer)
*pointer = n;
}

};


но использовать придётся с кастингом:

my_class c;
c [6][3] = 666;
int n = (int) c [6][3];


не проверял smile.gif

Автор: setq 23.5.2003, 11:21
а, вообще, проще надо быть. проще smile.gifsmile.gifsmile.gif

Автор: TimPP 23.5.2003, 11:28
Возьми стандартный STL класс vector отнаследуйся от него и не парь мозги! Для двугмерных масивов вложи vector в vector.

Автор: Unregistered 23.5.2003, 16:54
Цитата

my_class c;
c [6][3] = 666;
int n = (int) c [6][3];

Прикольно: int n = (int) c [6][3][6];

Автор: Unregistered 23.5.2003, 17:03
По граммотному так:

Код

class SubArray{
public:
        int& operator [](int);
///     Array & e.t.c

};
class Array{
public:
       SubArray& operator [](int);
}



В остальном надеюсь понятно.
Лучше сразу шаблон сделать.
А насчет STL Vector, советую посмотреть его реализацию.
Я бы в критических кодах им не пользовался.

Автор: Fantasist 23.5.2003, 18:01
У Страуструпа подобная вещь хорошо описанна. Slice-ами они называют ее. Типа:

Код


class Slice
{
private:
 char* m_data;
public:
 Slice (char* data): m_data(data) {};
 
  char* operator[](int i) {return m_data[i];};
}

class Matrix
{
private:
 char* m_data;
 int x,y;
public:
 ....  
 .....
 Sice& operator[](int i) {return Slice(m_data+i*x); };
}


Конечно, эта реализация примитивна, но идея такова.

Автор: RAN 23.5.2003, 20:57
Цитата
А насчет STL Vector, советую посмотреть его реализацию.
Я бы в критических кодах им не пользовался.


Это вы о чём?

Автор: DENNN 23.5.2003, 20:59
Вероятно о многопоточности.

Автор: TimPP 27.5.2003, 16:39
Не понял на счет многопоточности.

Может здесь есть любители реализации MFC контейнеров. Но, STL библиотека писалась докторами наук в программировании. А vector, есть ничто иное как указатель на масив, все вокруг это мишура ( хоть и реализована Microsoft ).

Просто и удобно!

Автор: DENNN 27.5.2003, 19:41
Цитата
Не понял на счет многопоточности.

Это значит что нормальная работа контейнеров гарантированна только в одно поточной среде. Если ты хочешь использоывать STL в многопоточной среде, то все вопросы синхронизации на твоей совести.

Цитата
А vector, есть ничто иное как указатель на масив

Если бы это было действительно только так и ничего более, то никто не стал бы его изобретать smile.gif

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