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


Автор: EvilsInterrupt 20.6.2009, 10:20
Я пишу класс 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;


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

Автор: andrew_121 20.6.2009, 10:34
Код

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

Автор: GoldFinch 20.6.2009, 10:36
он не унарный, он бинарный

Код

#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;
        }
};


Автор: EvilsInterrupt 20.6.2009, 10:43
респект орлы, огромное спасибо. Пойду пробовать ;)

Автор: W4FhLF 20.6.2009, 10:56
EvilsInterrupt, а чем стандартный std::ostream не устраивает?

Автор: GoldFinch 20.6.2009, 11:08
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;}

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

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

Вы уверены ?  smile 

Автор: GoldFinch 20.6.2009, 13:31
mes, не очень)

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

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

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

Автор: GoldFinch 20.6.2009, 16:12
mes, тогда x<<(y<<(z<<stream));

Автор: bsa 20.6.2009, 16:43
GoldFinch, ну это вообще изврат...

Автор: EvilsInterrupt 20.6.2009, 18:17
Пообщавшись с 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;

на этом пока и остановлюсь

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