C++问题,在通信中选择了以结构体传输, 大家讨论讨论!

auly403 2009-05-14 06:04:57
加精
对发送接收的数据以struct 还是 class 的关键字来封装?
要为每种结构本匹配一个函数填充数据,或者是在封装类实现,
希望高手把经验晒出来!
虽说是网络,其实是想学习:如何灵活应用C++的封装、继承,以及虚拟——虚拟函数和虚拟继承等
最好分享一下Stanley B.lippman 的<<深度探索C++对象模型>> 的经验。

ps: 由于不是请求解决实际, 仅是想詹仰一样高手高屋建瓴的气魄
...全文
3242 点赞 收藏 132
写回复
132 条回复
切换为时间正序
请发表友善的回复…
发表回复
king1076 2012-04-10
我想知道 c++ 和java之间怎么传说结构体
回复
就是用 结构体 方便
回复
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
终于看完了,学习了
回复
发动态
发帖子
网络编程
创建于2007-09-28

1.8w+

社区成员

VC/MFC 网络编程
申请成为版主
社区公告
暂无公告