Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка оператора. Как сделать? 
:(
    Опции темы
Guest_Andrei
  Дата 22.5.2003, 23:22 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











У меня есть класс где данные хранятся в линейном массиве.

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

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

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



  Вверх
man2002ua
Дата 23.5.2003, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 943
Регистрация: 12.11.2002
Где: Киев

Репутация: нет
Всего: 2



А почему двумерному и что будет в качестве измерений массива. И размерность массива?


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
setq
Дата 23.5.2003, 11:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











может быть так




#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 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











а, вообще, проще надо быть. проще smile.gifsmile.gifsmile.gif
  Вверх
TimPP
Дата 23.5.2003, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 22.5.2003

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) TimPP - 23.5.2003, 11:30
PM MAIL   Вверх
Unregistered
Дата 23.5.2003, 16:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата

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 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











По граммотному так:

Код

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

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



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

  Вверх
Fantasist
Дата 23.5.2003, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



У Страуструпа подобная вещь хорошо описанна. 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); };
}


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


--------------------
Волны гасят ветер...
PM MAIL   Вверх
RAN
Дата 23.5.2003, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



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


Это вы о чём?
PM MAIL ICQ   Вверх
DENNN
Дата 23.5.2003, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Вероятно о многопоточности.
PM ICQ   Вверх
TimPP
Дата 27.5.2003, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 22.5.2003

Репутация: нет
Всего: нет



Не понял на счет многопоточности.

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

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

PM MAIL   Вверх
DENNN
Дата 27.5.2003, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Цитата
Не понял на счет многопоточности.

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

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

Если бы это было действительно только так и ничего более, то никто не стал бы его изобретать smile.gif
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0799 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.