Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: пользуясь MSVC 6 , не могу перегрузить operator[]  (Прочитано 6839 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mayor
Специалист

ru
Offline Offline

« : 12-05-2004 15:33 » 

ситуация  такова :
есть класс:

Цитата
class BaseSort  
{
public:
   BaseSort(unsigned char *pB,unsigned char *pE);
   unsigned char *pEnd;
   unsigned char *pBegin;
   unsigned char bs[MAX_SYMBOLS];
   BaseSort();
   unsigned char* operator[](long i);
   void operator=(unsigned char* c);
   virtual ~BaseSort();

};

где :

unsigned char* BaseSort::operator [](long i)
{
   return pBegin+i*MAX_SYMBOLS;
}

есть шаблон функции :

Цитата
template<class T>
void quickSortR(T* a, long N) {
// На входе - массив a[], a[N] - его последний элемент.

  long i = 0, j = N;       // поставить указатели на исходные места
  T temp, p;

  p = a[ N>>1 ];      // центральный элемент

  // процедура разделения
  do {
    while ( a < p ) i++;
    while ( a[j] > p ) j--;

    if (i <= j) {
      temp = a; a = a[j]; a[j] = temp;
      i++; j--;
    }
  } while ( i<=j );


  // рекурсивные вызовы, если есть, что сортировать
  if ( j > 0 ) quickSortR(a, j);
  if ( N > i ) quickSortR(a+i, N-i);
}



при вызове:

unsigned char pFile;
long   FileSize;
....

BaseSort tt(pFile,pFile+FileSize);
quickSortR(&tt,FileSize);
 
 вместо моего operator[] " return (unsigned char*) pBegin+N/2*MAX_SYMBOLS " вызывается нечто вроде : " return (BaseSort&) &tt+i*sizeof(tt) "- я так думаю это operator[] по умолчанию
 
 и как следсвие того, что op[] возврашщяет BaseSort& вызывается уже не operator=(unsigned char*) , а operator=(BaseSort&);
 
 Как мне вставить свой operator[] в класс ?
 
 Или придется переписывать все шаблоны ?
Записан

1n c0de we trust
Xeysan
Гость
« Ответ #1 : 12-05-2004 19:50 » 

From MSDN:
Цитата

Note that the function operator[] returns a reference type. This causes it to be an l-value, allowing you to use subscripted expressions on either side of assignment operators.
Записан
NetRaider
Гость
« Ответ #2 : 13-05-2004 05:46 » 

Опрератор '[]' применяется к экземпляру класса, а у тебя он применяется к указателю.
Код:

p = a[ N>>1 (;  // a - УКАЗАТЕЛЬ на Т


Код:

Note that the function operator[( returns a reference type. This causes it to be an l-value, allowing you to use subscripted expressions on either side of assignment operators.


В общем случае 'operator[]' может возвращать все что угодно, но если необходимо присваивание значения возвращенному элементу, то естественно он должен вернуть объкт ссылочного типа.
Записан
mixa
Гость
« Ответ #3 : 16-05-2004 18:54 » 

NetRaider,
 
Цитата

но если необходимо присваивание значения возвращенному элементу, то естественно он должен вернуть объкт ссылочного типа.


Да, но приэтом надо не забывать про то что сам объект на который передается ссылка, должет продолжать существовать и после вызова функции.
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #4 : 19-05-2004 01:57 » 

2 Xeysan,NetRaider :

Вы правы по поводу возвращаемого значения , я настолько загрузился , что не заметил далее по коду :
temp = a ; //etc

2 mixa :
Как-то я не подумал про последствия использования ссылки на объект.



Есть у меня такое впечатлени , что под этот шаблон не один класс не подойдет , потому что  operator [] не перегрузить для использования с указателем на объект.

Если удасться понять как работает эта функция , попытаюсь превратить ее в шаблон класса , или хотя тогда при каждой рекурсии на стеке будет болтаться указатель на объект , может есть возможность в шаблоне функции создать пару глобальных переменных типа передаваемого в шаблон ?
В смысле,мне нужно чтобы
 T temp,p;
были в сегменте данных, а не на стеке, все равно они при каждой рекурсии переинициализируются.
Записан

1n c0de we trust
NetRaider
Гость
« Ответ #5 : 20-05-2004 00:49 » 

Цитата: mixa
NetRaider,
 
Цитата

но если необходимо присваивание значения возвращенному элементу, то естественно он должен вернуть объкт ссылочного типа.


Да, но приэтом надо не забывать про то что сам объект на который передается ссылка, должет продолжать существовать и после вызова функции.


Это все верно, вот только я не могу себе представить реализацию оператора '[]', который возвращал бы ссылку на локальный объкт. Ведь этот оператор необходим для доступа к элементам некоторого контейнера, время жизни объектов которого заведомо больше, чем время работы оператора.
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #6 : 21-05-2004 01:37 » 

Цитата

вот только я не могу себе представить реализацию оператора '[]', который возвращал бы ссылку на локальный объкт


Представь себе линейное адресное пространство , оператор [] просто получает адресс объекта , ему неважно , что на самом деле эта виртуальная область отведена под стек , если стек уже раскручен , то объект оказывается под esp , как следствие поля объекта неопределены , он вносит туда на основании ложных данных изменения , которые в свою очередь не один раз успеют затереться новыми значениями перед их использованием.

Отсюда мораль - локальный объект должен быть создан на стеке функции, вызывающей оператор [] .

Вся проблемма в том , что я никак не могу перегрузить оператор [] для работы с указателем на объект , который получает эта функция (если поискать в MSDN , то , наверное можно найти , что такое невозможно ) , а не с самим локальным объектом созданным в этой функциии .

Таким образом , пока что  единственный способ - это внести изменения в сам шаблон функции , что с моими знаниями мат. части крайне нежелательно .
Записан

1n c0de we trust
Serega
Гость
« Ответ #7 : 21-05-2004 08:53 » 

Ты лучше обьясни что тебе нужно сделать, проблема у тебя не в перегрузке оператора
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #8 : 01-06-2004 02:35 » 

А надоело мне с кубиком рубиком дурачиться - принялся за балду:
Создал файл с разной текстовой ахинеей, учитывая то что окончательно не ясно, как анализировать последовательности букв, решил воспользоваться последовательностью классов, любой из которых должен создать свой массив данных из файла или массива другого класса - теоретически это будет очень удобно расширять с появлением новых идей.

Застрял на сортировке элеметов массива, эта функция quickSort самая быстрая из тех которые я когда-либо видел, прекрасно сортирует массивы из предопределенных элементов, но когда дело дошло до классов, то SoftICE показывает, что она норовит вместо элементов массива отсортировать объекты класса.

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

1n c0de we trust
NetRaider
Гость
« Ответ #9 : 01-06-2004 02:55 » 

Цитата: Mayor

Застрял на сортировке элеметов массива, эта функция quickSort самая быстрая из тех которые я когда-либо видел, прекрасно сортирует массивы из предопределенных элементов, но когда дело дошло до классов, то SoftICE показывает, что она норовит вместо элементов массива отсортировать объекты класса.


Ничего не понял. Код покажи.
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #10 : 06-06-2004 02:05 » 

NetRaider,   какой именно код?Не понял
Шаблон функции quickSort и определение BaseSort я в начале топика писал, как бы я не писал реализацию операторов в BaseSort, они все равно не вызываются, так что толку их писать? Я их стер уже наверное вариантов 10 Жаль
Записан

1n c0de we trust
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines