社区
网络编程
帖子详情
C++问题,在通信中选择了以结构体传输, 大家讨论讨论!
auly403
2009-05-14 06:04:57
加精
对发送接收的数据以struct 还是 class 的关键字来封装?
要为每种结构本匹配一个函数填充数据,或者是在封装类实现,
希望高手把经验晒出来!
虽说是网络,其实是想学习:如何灵活应用C++的封装、继承,以及虚拟——虚拟函数和虚拟继承等
最好分享一下Stanley B.lippman 的<<深度探索C++对象模型>> 的经验。
ps: 由于不是请求解决实际, 仅是想詹仰一样高手高屋建瓴的气魄
...全文
3327
132
打赏
收藏
C++问题,在通信中选择了以结构体传输, 大家讨论讨论!
对发送接收的数据以struct 还是 class 的关键字来封装? 要为每种结构本匹配一个函数填充数据,或者是在封装类实现, 希望高手把经验晒出来! 虽说是网络,其实是想学习:如何灵活应用C++的封装、继承,以及虚拟——虚拟函数和虚拟继承等 最好分享一下Stanley B.lippman 的<> 的经验。 ps: 由于不是请求解决实际, 仅是想詹仰一样高手高屋建瓴的气魄
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
132 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
king1076
2012-04-10
打赏
举报
回复
我想知道 c++ 和java之间怎么传说结构体
昂昂昂昂昂啊
2011-11-04
打赏
举报
回复
就是用 结构体 方便
chenhuakui
2011-02-28
打赏
举报
回复
C++中类与结构的唯一区别是:类(class)定义中默认情况下的成员是private的,而结构(struct)定义中默认情况下的成员是public的。
在C中,结构中不允许有成员函数。而在C++中可以有成员函数。
guoxiaojuan1984
2011-02-16
打赏
举报
回复
习惯用struct封装数据结构
robertcarlos
2011-02-07
打赏
举报
回复
C++中,struct只是用来兼容C的语法.官方推荐结构体是用class.
clr998998
2011-01-27
打赏
举报
回复
如果我在结构体中定义了一个长度为50的数组,但是其实际里面假如只有5个是有数据的,请问我在发送的时候能不能只发送这有数据的5个的大小呢??
TRUE
2010-02-10
打赏
举报
回复
在面向对象的角度看,STRUCT 和class是有些差别的,就向上面描述的一样,但是我们不要忘了我们的目的,网络,对于网络来说,内容越少越好,首先不要占有很大的带宽,也就减少丢包的可能性了,如果使用类,则所传递的字节数可能就比较大了,因此肯定是不合适的。
clever101
2010-01-23
打赏
举报
回复
[Quote=引用 7 楼 flyskytoday 的回复:]
引用 5 楼 cnzdgs 的回复:
struct和class并无本质差别,只是struct中的成员默认为public,class的成员默认为private。习惯上把数据用struct封装,把数据和代码用class封装。
正确吗?
class不但默认是private而且还可以包含函数,而struct里面不可以再有函数。
struct比class简洁,不可以继承
[/Quote]
呵呵,struct最好有个构造函数的,好像是effictive C++说的。
xwsn007
2009-08-28
打赏
举报
回复
94楼说的好
yybing
2009-06-30
打赏
举报
回复
[Quote=引用 115 楼 firststudy 的回复:]
在C++中struct和class在语法上存在两点不同:
1、默认的继承方式,struct默认继承方式为public,class为private。
2、成员的默认访问权限,struct默认访问权限为public,class为private。
其他都是相同的,都可以定义函数封装数据成员。
在内存中的布局存在如下不同:
1、struct中存储的数据成员在内存中是按声明顺序并且连续存储的,class中存储的数据成员不能保证总是按声明顺序并且连续存储的。
综述:
1、两者…
[/Quote]
小样,看不出来呀,还有这么一手
xiushu
2009-06-14
打赏
举报
回复
总结:
1.结构体传输中不要传递指针,因为跨进程地址无效
2.用class可以封装数据操作,便于扩展,至于传递数据可以用序列化函数SetStream实现
3.继续学习...
stone1116
2009-06-12
打赏
举报
回复
现在实际开发过程中好象没有几个使用class都使用的是struct,这只是一个习惯问题
jyh_baoding
2009-06-12
打赏
举报
回复
因为传递的是数据,不是函数,所以不闭用CALSS,struct足够了,当然,你要传递CALSS对象也可以,估计没什么意义
teleinfor
2009-06-11
打赏
举报
回复
[Quote=引用 115 楼 firststudy 的回复:]
在C++中struct和class在语法上存在两点不同:
1、默认的继承方式,struct默认继承方式为public,class为private。
2、成员的默认访问权限,struct默认访问权限为public,class为private。
其他都是相同的,都可以定义函数封装数据成员。
在内存中的布局存在如下不同:
1、struct中存储的数据成员在内存中是按声明顺序并且连续存储的,class中存储的数据成员不能保证总是按声明顺序并且连续存储的。
综述:
1、两者…
[/Quote]
定你的静电总结!不错。
pysjp
2009-06-10
打赏
举报
回复
struct和class应该都可以,不过由于只是封装数据,而没有对数据的操作,所以习惯上用struct就可以了
Sk_suN
2009-06-09
打赏
举报
回复
前几天才做过这个写毕业设计
我用的是struct,感觉很不错
自由之眼
2009-06-09
打赏
举报
回复
我在想,楼主是不是在思考关于数据传输中,如何兼顾效率和便捷性的问题?
根据我做过的一些项目经验,可以给楼主一些建议。
其实,对于数据传输,class和struct的本质是一样的,如果你不在乎不同操作系统之间的差异,这些东西是可以忽略的。给楼主一个建议,不要将自己的思维模式僵死在一定谁更优秀。在千奇百怪的需求中,并没有一个标准的答案。
我开发过几年网络游戏服务器,对此略有一些心得,给楼主一些注意。
首先,不要陷入代码的实际操作中,这是很危险的。一定要明白自己要什么,再去根据想法实现代码的编写,你要驾驭的是代码,而不是让代码驾驭你。
对于网游中的代码通讯,一般是要求实时性比较高的。我一开始曾经也考虑过楼主的这个想法。如果我直接实现传输一个struct或者class,对方接受了这样的数据,只要根据数据的标识还原成不同的类不就好了么。并且后来我自己写了一个这样的服务器,发现实际应用中,struct和class是一样的。但是这里有一个问题,如果class和struct里面包含一些函数,你把整个类的内存地址传输过去的时候,依然会在对方那里报错,为什么呢。这是因为,如果你的类或者结构中包含若干函数,这些函数实际上是一些地址,而你把这些地址传输给远端服务器(客户端)的时候,因为远端内存并不存在这个地址所指向的函数接口,所以会提示你类方法无效。后来我想,确实,对于传输而言,我要的只是类或者结构中的数据,处理方法可以在远端实现。单纯的传输struct或者class中的函数本身是没有意义的,第一是浪费传输的字节(函数地址入口实例化后指向的内存地址本身只对本机有意义,在远端毫无用处)。第二是在不同的操作系统中,对某些特定的数据可能会存在处理上的差异。也就是楼上的某些朋友有为什么要强调内存对齐的原因。
其实,最好的操作是数据串行化。
可能楼主对串行化比较了解,我在这里多几句嘴。
我的实现是这样的,在所有的类中,我都提供一个GetStream()和SetStream()方法。
当我确认这个类需要传输的时候,我会把类中用到的数据,按照一定的方式,可以使用memcpy()等方式,把类中的数据排列成一个大的char*,无论这个类里面有多少类型。我都做一个串行化的类提供将这些数据转换成为一个内存流的方法SetStream()。
然后把这个内存流发送出去(一般在流的前面,追加整个流的长度),在远端将这些数据GetStream()还原到指定的类结构中。
这样做的好处是,可以在串行化的过程中,自己定义存储规则,这样比较好跨越不同的操作系统(毕竟通常的Linux服务器和Windows客户端)。而且数据很精简。不带一丝多余的东西,当然,你也可以对这些数据进行加密,比如常用的3DES算法。这样做能保护你的数据传不被别人轻易破解。
关于传输,其实最大的目的就是用最小的字节,最快的实现和最方便的应用,去解决一些实际需求的问题,和具体使用Struct还是class关系不大,关键在于你想怎么做。
如果有什么疑问,可以再这里问,呵呵,大家一起探讨。
代码不是关键的,而是你要懂得思路。
firststudy
2009-06-09
打赏
举报
回复
在C++中struct和class在语法上存在两点不同:
1、默认的继承方式,struct默认继承方式为public,class为private。
2、成员的默认访问权限,struct默认访问权限为public,class为private。
其他都是相同的,都可以定义函数封装数据成员。
在内存中的布局存在如下不同:
1、struct中存储的数据成员在内存中是按声明顺序并且连续存储的,class中存储的数据成员不能保证总是按声明顺序并且连续存储的。
综述:
1、两者都可以实现数据的抽象和封装。
2、若是为了方便和C兼容,建议使用struct,因为在C中没有class。
3、若是只是为了封装大量数据,并且对数据操作不多,建议使用struct,因为class背后蕴藏的基本思想是数据的抽象和封装,侧重点在抽象的接口,
而不是具体的数据或者如何该接口如何工作。
从上面的综述可以看出,建议用class来封装对数据操作的接口,不过底层数据需要用struct类来封装。
具体是实现如下:
typedef struct tagRawData_t
{
TypeA a;
TypeB b;
//.....
}RawData_t, *PRawData_t;
class COperateData
{
public:
PRawData_t GetRawData()const;
void SetRawData(const RawData_t&);
private:
PRawData_t m_pPRawData;
};
个人认为这样既利于以后的扩展(封装了底层数据,可以保证底层数据改变时使用它的客户代码不会受到影响),也封装了变化,同时减少了不必要的编译依赖。
何日人再来
2009-06-08
打赏
举报
回复
mark
ToCpp
2009-06-01
打赏
举报
回复
终于看完了,学习了
加载更多回复(110)
Java和
c++
的Socket
通信
如何发送
结构体
服务端
C++
程序,客户端java程序,发送报文格式:
结构体
报头+数据负载,客户端发送和接收时需要做字节序的转换。 Ecplise+jdk1.6 运行成功
socket
传输
结构体
的解决办法
socket
传输
结构体
的解决办法,一般的socket只能
传输
字符串,怎么解决这个
问题
呢?看看这个吧
java与
c++
通过socket
通信
java与
c++
通过socket
通信
。其
中
java作为客户端,
c++
作为服务器。主要解决了
C++
中
的
结构体
在java
中
如何实现和模拟。还有int,float,及字符串的处理。极具代表性。
嵌入式C与
C++
语言精华文章集锦
嵌入式C与
C++
语言精华文章集锦嵌入式C与
C++
语言精华文章集锦
protoc-2.5.0-win32.zip
protobuf在win下的编译器,2.5.0版本
网络编程
18,363
社区成员
64,187
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章