社区
C++ 语言
帖子详情
关于流操作符重载!!
wvins
2005-09-22 07:12:51
流操作符重载有什么要求吗?
为什么我得重载操作符总提示无法访问类的私有成员呢?
具体代码身边没有,下次再贴了。
...全文
230
5
打赏
收藏
关于流操作符重载!!
流操作符重载有什么要求吗? 为什么我得重载操作符总提示无法访问类的私有成员呢? 具体代码身边没有,下次再贴了。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wvins
2005-10-21
打赏
举报
回复
把
#include<iostream>
using namespace std;
改为
#include<iostream.h>
可以解释一下为什么吗?
也许会使这个问题!
友元啊什么的应该没问题!
killer1984
2005-09-23
打赏
举报
回复
要访问私有成员就把重载的操作符声明为友元。
Jagen在路上
2005-09-22
打赏
举报
回复
compack.cpp
#include "kx_compacket.h"
#ifndef WIN32
# include <netinet/in.h>
#else
# include <winsock2.h>
#endif
//---------------------------------------------------------------------------
namespace kxlib {
// kx_ComInPacket
//---------------------------------------------------------------------------
// 从缓冲区中输入一个字节
kx_InPacket& kx_ComInPacket::operator>>( uint8& b )
{
if ( m_pbCursor <= m_pbData + m_nDataLen - sizeof(b) )
{
b = *( reinterpret_cast< const BYTE* >( m_pbCursor ) );
m_pbCursor += sizeof(b);
}
else
{
b = 0;
}
return (*this);
}
//---------------------------------------------------------------------------
// 从缓冲区中输入一个字
kx_InPacket& kx_ComInPacket::operator>>( uint16& w )
{
if ( m_pbCursor <= m_pbData + m_nDataLen - sizeof(w) )
{
w = ntohs( *( reinterpret_cast< const WORD* >( m_pbCursor ) ) );
m_pbCursor += sizeof(w);
}
else
{
w = 0;
}
return (*this);
}
//---------------------------------------------------------------------------
// 从缓冲区中输入一个双字
kx_InPacket& kx_ComInPacket::operator>>( uint32& dw )
{
if ( m_pbCursor <= m_pbData + m_nDataLen - sizeof(dw) )
{
dw = ntohl( *( reinterpret_cast< const DWORD* >( m_pbCursor ) ) );
m_pbCursor += sizeof(dw);
}
else
{
dw = 0;
}
return (*this);
}
//---------------------------------------------------------------------------
// 从缓冲区中输入一个ASCII字符串
kx_InPacket& kx_ComInPacket::operator>>( const char*& str )
{
uint16 len;
operator>>( len );
if ( m_pbCursor <= m_pbData + m_nDataLen - len && ! m_pbCursor[ len - 1 ] )
{
str = reinterpret_cast< const char* >( m_pbCursor );
m_pbCursor += len;
}
else
{
str = "";
}
return (*this);
}
//---------------------------------------------------------------------------
// 从缓冲区中输入一个ASCII字符串
kx_InPacket& kx_ComInPacket::operator>>( string& str )
{
const char* p;
operator >>( p );
str = p;
return (*this);
}
//---------------------------------------------------------------------------
// 读取缓冲区中的数据,但不能对数据进行修改
const uint8* kx_ComInPacket::readData( int32& size ) const
{
size = static_cast<int32>( m_nDataLen - ( m_pbCursor - m_pbData ) );
return m_pbCursor;
}
//kx_ComOutPacket
//---------------------------------------------------------------------------
// 设置当前数据指针
uint32 kx_ComOutPacket::setCursor( uint32 off )
{
uint32 old = static_cast< uint32 >( m_pbCursor - m_arrbData );
m_pbCursor = m_arrbData + off;
return old;
}
//---------------------------------------------------------------------------
// 向数据缓冲区输出一个字节的数据。
kx_OutPacket& kx_ComOutPacket::operator<<( uint8 b )
{
if ( m_pbCursor <= m_arrbData + MAX_PACKET_SIZE - sizeof( b ) )
{
*( reinterpret_cast< uint8* >( m_pbCursor ) ) = b;
m_pbCursor += sizeof( b );
}
return (*this);
}
//---------------------------------------------------------------------------
// 向数据缓冲区输出一个字的数据
kx_OutPacket& kx_ComOutPacket::operator<<( uint16 w )
{
if ( m_pbCursor <= m_arrbData + MAX_PACKET_SIZE - sizeof( w ) )
{
*( reinterpret_cast< uint16* >( m_pbCursor ) )= htons(w);
m_pbCursor += sizeof( w );
}
return (*this);
}
//---------------------------------------------------------------------------
// 向数据缓冲区输出一个双字数据
kx_OutPacket& kx_ComOutPacket::operator<<( uint32 dw )
{
if ( m_pbCursor <= m_arrbData + MAX_PACKET_SIZE - sizeof( dw ) )
{
*( reinterpret_cast< uint32 *>( m_pbCursor ) ) = htonl(dw);
m_pbCursor += sizeof( dw );
}
return (*this);
}
//---------------------------------------------------------------------------
// 向数据缓冲区输出一个ASCII字符串
kx_OutPacket& kx_ComOutPacket::operator<<( const char* str )
{
uint16 len = static_cast< uint16 >( strlen( str ) + 1 );
if ( m_pbCursor <= m_arrbData + MAX_PACKET_SIZE - sizeof( len ) - len )
{
operator<<( len );
strcpy( reinterpret_cast< char* >( m_pbCursor ), str );
m_pbCursor += len;
}
return (*this);
}
//---------------------------------------------------------------------------
// 向输出缓冲区写入数据
void kx_ComOutPacket::writeData( const uint8* buf, int32 size )
{
if ( m_pbCursor <= m_arrbData + MAX_PACKET_SIZE - size )
{
memcpy( m_pbCursor, buf, size );
m_pbCursor += size;
}
}
};
Jagen在路上
2005-09-22
打赏
举报
回复
没什么特殊要求,下面是我曾经实现过的代码,你看看。
compack.h
/*!
* 通用输入包处理类,这给类表现了数据包处理的一种思路。
*
* @author 赵鑫磊
* @short 通用输入包处理类
*/
class __EXPORT_NET kx_ComInPacket : public kx_InPacket
{
protected: // 保护数据
const uint8* m_pbData; // 数据
uint32 m_nDataLen; // 数据长度
const uint8* m_pbCursor; // 数据指针
public: // 构造
/*!
* 输入信令包类构造函数, 根据输入缓冲区数据构造输入信令处理类,
* 初始化保护成员m_szData,m_nDataLen,m_pCurssor。
*
* @param data 输入数据缓冲区地址
* @param len 输入数据缓冲区长度
*/
kx_ComInPacket( const uint8* data, uint32 len )
{
m_pbData = m_pbCursor = data;
m_nDataLen = len;
}
public: // 属性
/*! 获得缓冲区数据,不能对缓冲区数据进行修改,一般用于数据的传送。*/
virtual const uint8* getData( void ) const{ return m_pbData; }
/*! 获得缓冲区的大小,用于需获得当前缓冲区的长度的计算。*/
virtual int32 getSize( void ){ return m_nDataLen; }
public: //方法
/*!
* 从缓冲区中输入一个字节,缓冲区数据指针向后移动一个字节。
*
* @param b 用于接收字节数据
* @return 输入包实例
*/
virtual kx_InPacket& operator>>( uint8& b );
/*!
* 从缓冲区中输入一个字,缓冲区数据指针向后移动一个字。
*
* @param w 用于接收字数据
* @return 输入包实例引用
*/
virtual kx_InPacket& operator>>( uint16& w );
/*!
* 从缓冲区中输入一个双字,缓冲区数据指针向后移动一个双字。
*
* @param dw 用于接收双字数据
* @retrun 输入包实例引用
*/
virtual kx_InPacket& operator>>( uint32& dw );
/*!
* 从缓冲区中输入一个ASCII字符串,根据缓冲区中当前指针的位
* 置指向的一个字的内容确定字符串的长度,并根据这个长度读
* 取随后的数据到str缓冲区中。
*
* @param str 用于接收ASCII字符串
* @return 输入包实例引用
*/
virtual kx_InPacket& operator>>( const char*& str );
/*!
* 从缓冲区中输入一个ASCII字符串。调用
* kx_InPacket& operator>>( const LPCHAR& str )获得字符
* 串数据,之后传递给string。
*
* @param str 用于接收ASCII字符串
* @return 输入包实例引用
*/
kx_InPacket& operator>>( string& str );
/*!
* 读取缓冲区中的数据,但不能对数据进行修改.一般先调用一次,用
* 于获得缓冲区的数据长度,之后再调用,将缓冲区数据复制到新的
* 缓冲区。
*
* @param size 用于返回缓冲区中数据的长度
* @return 缓冲区中数据的指针
*/
const uint8* readData( int32& size ) const;
};
//---------------------------------------------------------------------------
#ifndef MAX_PACKET_SIZE
#define MAX_PACKET_SIZE 8192
#endif
/*!
* 通用输出包处理类,这给类表现了数据包处理的一种思路。
*
* @author 赵鑫磊
* @short 通用输出包处理类
*/
class __EXPORT_NET kx_ComOutPacket : public kx_OutPacket
{
protected: // 保护成员
uint8 m_arrbData[MAX_PACKET_SIZE]; // 数据缓冲区
uint8* m_pbCursor; // 数据指针
public: // 构造
/*!
* 输出信令包类构造函数,将数据指针指向缓冲区起始地址
*/
kx_ComOutPacket( void ) { m_pbCursor = m_arrbData; }
public: // 属性
/*!
* 获得缓冲区数据,获得缓冲区地址。不能对缓冲区数据进
* 行修改,一般用于数据的传送。
*
* @retrun 缓冲区地址
*/
const uint8* getData( void ) const{ return m_arrbData; }
/*!
* 获得缓冲区的大小,用于需获得当前缓冲区的长度的计算。
*
* @return 缓冲区的大小
*/
int32 getSize( void ) { return static_cast<int32>( m_pbCursor - m_arrbData ); }
public: // 方法
/*!
* 设置当前数据指针,调整当前的数据指针,便于数据的反复检索。
*
* @param off 相对于数据缓冲区起始位置的偏移量
* @return 原数据指针位置
*/
uint32 setCursor( uint32 off );
/*!
* 向数据缓冲区输出一个字节的数据。同时数据指针后移
* 一个字节。
*
* @param b 要输出的数据
* @return 输出包实例引用
*/
virtual kx_OutPacket& operator<<( uint8 b );
/*!
* 向数据缓冲区输出一个字的数据。同时数据指针后移一
* 个字。
*
* @param w 要输出的数据
* @return 输出包实例引用
*/
virtual kx_OutPacket& operator<<( uint16 w );
/*!
* 向数据缓冲区输出一个双字数据。同时数据指针后移
* 一个双字。
*
* @param dw 要输出的双字数据
* @return 输出包实例引用
*/
virtual kx_OutPacket& operator<<( uint32 dw );
/*!
* 向数据缓冲区输出一个字符串数据。首先在当前数据指
* 针位置插入一个字的字符串长度数据接下来存放字符串
* 数据,数据指针后移到字符串末尾。
*
* @param str 要输出的字符串
* @return 输出包实例引用
*/
virtual kx_OutPacket& operator<<( const char* str );
/*!
* 向数据缓冲区输出一个字符串数据。首先将string类型转换成
* char*类型,调用成员函数kx_OutPacket& operator<<( const char* str )
* 参数: const string& str 要输出的字符串
* 返回值: kx_OutPacket& 输出包实例引用
*/
kx_OutPacket& operator<<( const string& str )
{
return operator<<( str.c_str() );
}
/*!
* 向输出缓冲区写入数据,数据指针后移。
*
* @param Buf 要写入数据的缓冲区地址
* @param size 要写入数据的字节数
*/
virtual void writeData( const uint8* Buf, int32 size );
};
};
llf_hust
2005-09-22
打赏
举报
回复
把
#include<iostream>
using namespace std;
改为
#include<iostream.h>
2014年最新JAVA面试题汇总经典例子及其答案
2. **面向对象**:Java是面向对象的语言,面试官可能询问类、对象、接口、抽象类的区别,以及构造器、访问修饰符、继承、多态、重写和
重载
的概念。 3. **集合框架**:ArrayList、LinkedList、HashMap、HashSet等...
流
操作符
重载
一、输出
流
操作符
重载
: ① 函数原型:ostream& operator<<(ostream outs,const point& source); ② 解析:该函数具有两个参数,outs(是一个ostream的对象)和source(是一个point...
什么是
操作符
重载
一、什么是
操作符
重载
操作符
重载
可以分为两部分:“
操作符
”和“
重载
”。说到
重载
想必都不陌生了吧,这是一种编译时多态,
重载
实际上可以分为函数
重载
和
操作符
重载
。运算符
重载
和函数
重载
的不同之处在于
操作符
重载
...
【C++】 类与对象——
流
操作符
重载
,const成员函数
本文介绍了
流
操作符
重载
, const成员函数
操作符
重载
操作符
重载
操作符
重载
是一个大坑,不同符号
重载
的规则有不同的限定。让我们一个一个填坑吧。
重载
的基本方法
重载
可以定义在类里,也可以定义成全局函数并加上友元。比如,同样是加操作,可以 class Complex{ ...
C++ 语言
65,206
社区成员
250,519
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章