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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка унарного оператора "<<" 
:(
    Опции темы
EvilsInterrupt
Дата 20.6.2009, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



Я пишу класс C_FIleStream , в написаном ниже куске кода он известен как объект с именем "file_strm"

Хочу перегрузить оператор "<<", чтобы можно из объекта закинуть в типы byte, word, dword и наоборот. Ниже кусок кода иллюстирует то, что хочу получить в итоге:

Код

  DWORD d1, d2;
  WORD  w1  w2;
  BYTE  b1, b2;

  d1 << file_strm;
  w1 << file_strm;
  b1 << file_strm;

  file_strm << d2;
  file_strm << w2;
  file_strm << b2;


Прошу подмогнуть с реализацией.

Это сообщение отредактировал(а) EvilsInterrupt - 20.6.2009, 10:22
PM MAIL WWW ICQ Jabber   Вверх
andrew_121
Дата 20.6.2009, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Код

class C_FIleStream {
public:
...
   C_FIleStream& operator<< (byte v) {
      // код записывающий в файл
      return *this;
   }
   C_FIleStream& operator>> (byte &v) {
      // код читающий из файла
      return *this;
   }
};



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
GoldFinch
Дата 20.6.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



он не унарный, он бинарный

Код

#pragma pack(push,2)
        struct packetbuf
        {
                unsigned short length;
                char data[USHRT_MAX+1-2];
        };
#pragma pack(pop)

class basic_packetstream 
{
public:
        void skip(int n)        {pos+=n;}
        void reset()            {pos=&buf.data[0];}
        char* back() const      {return pos;}
protected:
        basic_packetstream() {}
        packetbuf buf;
        char* pos;
};

class ipacketstream: public basic_packetstream 
{
public:
        //простые типы
#define IMPL(T) {data=*(T*)pos;pos+=sizeof(T);return *this;}
        ipacketstream& operator>>(char& data) IMPL(char)
        ipacketstream& operator>>(unsigned char& data) IMPL(unsigned char)
        ipacketstream& operator>>(short& data) IMPL(short)
        ipacketstream& operator>>(unsigned short& data) IMPL(unsigned short)
        ipacketstream& operator>>(int& data) IMPL(int)
        ipacketstream& operator>>(unsigned int& data) IMPL(unsigned int)
        ipacketstream& operator>>(__int64& data) IMPL(__int64)
        ipacketstream& operator>>(unsigned __int64& data) IMPL(unsigned __int64)
        ipacketstream& operator>>(float& data) IMPL(float)
        ipacketstream& operator>>(double& data) IMPL(double)
#undef IMPL
        //составные типы
        ipacketstream& operator>>(std::string&);
        ipacketstream& operator>>(std::wstring&);
        //манипуляторы
        ipacketstream& operator>> (ipacketstream&(*manipulator)(ipacketstream&))
        {       return manipulator(*this);      }
        template<typename Func>
        ipacketstream& operator>> (Func& manipulator)
        {       return manipulator(*this);      }       
public:
        size_t size() {return buf.length;}
        packetbuf& buffer() { return buf; }     
};

class opacketstream: public basic_packetstream
{
public:
        opacketstream() {reset();};
public:
        //простые типы
#define IMPL(T) {*(T*)pos=data;pos+=sizeof(T);return *this;}
        opacketstream& operator<<(char data) IMPL(char)
        opacketstream& operator<<(unsigned char data) IMPL(unsigned char)
        opacketstream& operator<<(short data) IMPL(short)
        opacketstream& operator<<(unsigned short data) IMPL(unsigned short)
        opacketstream& operator<<(int data) IMPL(int)
        opacketstream& operator<<(unsigned int data) IMPL(unsigned int)
        opacketstream& operator<<(__int64 data) IMPL(__int64)
        opacketstream& operator<<(unsigned __int64 data) IMPL(unsigned __int64)
        opacketstream& operator<<(float data) IMPL(float)
        opacketstream& operator<<(double data) IMPL(double)
#undef IMPL
        //составные типы
        opacketstream& operator<<(std::string&);
        opacketstream& operator<<(std::wstring&);
        //манипуляторы
        opacketstream& operator<< (opacketstream&(*manipulator)(opacketstream&))
        {       return manipulator(*this);      }
        template<typename Func>
        opacketstream& operator<< (Func& manipulator)
        {       return manipulator(*this);      }
public:
        size_t size() { return pos-&buf.data[0];        }
        packetbuf& buffer() 
        { 
                buf.length=size();
                return buf;
        }
};


PM MAIL ICQ   Вверх
EvilsInterrupt
Дата 20.6.2009, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



респект орлы, огромное спасибо. Пойду пробовать ;)
PM MAIL WWW ICQ Jabber   Вверх
W4FhLF
Дата 20.6.2009, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



EvilsInterrupt, а чем стандартный std::ostream не устраивает?


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
GoldFinch
Дата 20.6.2009, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



EvilsInterrupt, чтобы получить
d1 << file_strm;

надо вне класса писать
Код

DWORD operator<<(DWORD& dst, istream& sin)
{ 
dst=.... или read(&dst,sizeof(dst))
return dst;
}


но както логичнее, 
  file_strm>>d1;
это более схоже с STL

---------------
там более что часто надо писать 
   stream>>x1>>x2>>x3;
хотя можно сделать
   x1<<x2<<x3<<stream

если будет
 istream& operator<<(DWORD& dst, istream& sin) {   ....   return sin;}


Это сообщение отредактировал(а) GoldFinch - 20.6.2009, 11:12
PM MAIL ICQ   Вверх
mes
Дата 20.6.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(GoldFinch @  20.6.2009,  10:08 Найти цитируемый пост)
хотя можно сделать
   x1<<x2<<x3<<stream

если будет
 istream& operator<<(DWORD& dst, istream& sin) {   ....   return sin;}

Вы уверены ?  smile 


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 20.6.2009, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



mes, не очень)
PM MAIL ICQ   Вверх
mes
Дата 20.6.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(mes @  20.6.2009,  10:42 Найти цитируемый пост)

Вы уверены ?
Цитата(GoldFinch @  20.6.2009,  12:31 Найти цитируемый пост)
не очень) 
 

Ваш способ не будет работать, так как уже в первой паре нет типа istream, a соответсвено эта перегруженная функция не применима.



--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 20.6.2009, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



mes, тогда x<<(y<<(z<<stream));
PM MAIL ICQ   Вверх
bsa
Дата 20.6.2009, 16:43 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



GoldFinch, ну это вообще изврат...

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


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



Пообщавшись с Lazin через аську, решил воспользоваться его советом:

Код

template<typename T>
I_Stream& operator >> (I_Stream & s, T& t)
{
  s.read((const BYTE*)&t, sizeof(T)) != sizeof(T);
  return s;
}

template<typename T>
I_Stream& operator << (I_Stream& s, T const& t)
{
  s.write((const BYTE*)&t, sizeof(t));
  return s;
}


чтобы делать так:

BYTE b1, b2;
WORD w1, w2;
DWORD d1, d2;

file_stream >> b1;
file_stream >> w1;
file_stream >> d1;

file_stream << b2;
file_stream << w2;
file_stream << d2;

на этом пока и остановлюсь
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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