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


Автор: andrew_121 31.1.2009, 12:06
Дарова!
Вопрос в следующем:
Есть класс File, и метод operator[] (int).
Могу перегрузить его либо для чтения.
Класс File оперирует записями типа int.

Автор: pan2004 31.1.2009, 12:26
Цитата(andrew_121 @  31.1.2009,  12:06 Найти цитируемый пост)
Могу перегрузить его либо для чтения.

у меня такое впечатление, что ты не закончил свою мысль)

Автор: vinter 31.1.2009, 12:29
Цитата(andrew_121 @  31.1.2009,  13:06 Найти цитируемый пост)
Могу перегрузить его либо для чтения.

возвращай ссылку на внтуренний элемент, вот тебе и будет read\write

Автор: pan2004 31.1.2009, 12:31
Цитата(vinter @  31.1.2009,  12:29 Найти цитируемый пост)
возвращай ссылку на внтуренний элемент, вот тебе и будет read\write

правда новый элемент таким макаром не создашь.
да и вообще непонятно, что возвращать, если индекс недействителен. Exception?

Автор: andrew_121 31.1.2009, 12:33
Простите. Уточняю...
Код

int File::operator[] (int idx) {
   int result;
   seek(idx*sizeof(int));
   read(&result, sizeof(int));
   return result;
}

С этим проблем нет.
Но как его перегрузить чтоб можно было изменять значения?

Автор: pan2004 31.1.2009, 12:37
Цитата(andrew_121 @  31.1.2009,  12:33 Найти цитируемый пост)
Но как его перегрузить чтоб можно было изменять значения?

таким макаром, наверно - никак.
Самый простой способ - считай файл вначале полностью в память(в конструкторе), а потом возвращай ссылки на нужные участки файла(элементы массива)...

Автор: andrew_121 31.1.2009, 12:55
Цитата(pan2004 @  31.1.2009,  12:37 Найти цитируемый пост)
Самый простой способ - считай файл вначале полностью в память

Это невозможно. Исключено!!!

Автор: pan2004 31.1.2009, 13:07
Тогда остается только сложный способ - возвращай объект-посредник, который и будет менять значение по требованию. Можно сделать его и так, что его использование станет вполне прозрачным. например:
Код

myfile[index] = 25;

для этого достаточно перегрузить operator=(int);

Автор: andrew_121 31.1.2009, 13:15
pan2004, Не понял...

Автор: pan2004 31.1.2009, 13:35
Примерно так:
Код

class OurFile;
class IndexHelper
{
   int idx;
   OurFile& mParent;
public:
   IndexHelper(OurFile& parent, int index): mParent(parent)
   {
      idx = index; 
   }
   operator int()
   {
       //Здесь возвращаем обычное значение rvalue
   }
   IndexHelper& operator=(int value)
   {
       //Здесь изменяем значение
       return *this;
   }
};
class OurFile
{
...
   friend class IndexHelper;
   IndexHelper operator[](int idx)
   {
        return IndexHelper(*this, idx);
   }
...
};

Автор: andrew_121 31.1.2009, 13:48
pan2004, Ага... Так operator= (int) нужно перегрузить во вспомогателе... ))) Понял.
Щас попробую.
Спасибо!

Автор: andrew_121 31.1.2009, 14:46
Всем спасибо. Все получилось. Тема закрыта.

Автор: just_geek 31.1.2009, 23:39
Код

        real_t& operator[] ( int index ) {
            assert(index >= 0 && index < 2);
            return arr[index];
        }

        real_t operator[] ( int index ) const {
            assert(index >= 0 && index < 2);
            return arr[index];
        }

типа того smile

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