发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
这篇是关于C++入门。
为了自编一个聊天程序,我们先考虑一下每一个聊天个体在程序中是个什么存在形式。
一个个体(这里把一个参与聊天的个体成为一个对象)有多个属性,比如他的昵称、他的ID、他的IP地址和端口等,这些属性都属于同一个对象;对于每个人,他和别的人都可能产生对话,那么这些对话都是需要保存的,否则你切换一个聊天对象,之前对象的聊天内容都不在了。
为了给所有对象一个唯一且易查找的标志,ID属性是必要的,而且最好用无符号整数来表示。
C++是面向对象的语言,对象是什么?
好吧,你该反思为什么你现在还没对象了。
类是对象的抽象。
有个故事是一个人去水果摊买水果,姑且叫他琪琪。
琪琪:我买水果
店家:什么水果?
琪琪:我买水果。
店家:拿,香蕉。
琪琪:我要水果。
店家:(手拿梨子)给。
琪琪:我要水果。
店家觉得这货太装逼了,一把刀砍死了琪琪。
从这个故事我们可以看出类和对象的关系,故事中有一个水果类CFruit:
class CFruit
{
CString Name;
CColor Color;
CTaste Taste;
CFruit(CString Name);
};
前三行中的CString、CColor、CTaste都是类型名,它们前面的“C”是Class的意思,表示这个类型是一个类(区别于int这些基础类型);跟在它们后面的是对应类型的变量Name、Color、Taste,而它们在CFruit类中就叫CFruit类的成员变量。
最后一行的与类名同名的一个函数,没有返回值,参数根据需要可有可无。它叫做这个类的构造函数,每新建一个该类的对象就会显式或隐式地调用这个函数。
显式像这样:
CFruit *Apple=new CFruit("苹果");
或者这样:
CFruit Apple=*(new CFruit("苹果"));
任何类的对象都可以用new来新建,它的返回值是该对象的指针。
前者用的是传指针的方法来获得生成的对象
后者是用的传值的方法来复制了一个新生成的对象。
所以琪琪应该说“我要买名叫XX的水果”。
我们在操作系统中也不能要水果,一定要指明要什么样的水果。
不过水果是什么,还得我们告诉操作系统。
这是哲学么?
好了,类就说到这里。
考虑服务程序端,一个聊天对象可以定义为这样的一个类:
class CUser
{
unsigned int UserID;
CString NickName;//CString 是C++中的一个类,它集成了关于字符串的很多属性以及操作。
CString ClientIP;用例如“113.54.141.250”的字符串形式保存客户端IP
int ClientPort;
CUser(int userid,CString nickname);//构造函数,在构造的时候就为该对象赋值。
};
如果聊天记录保存在客户端,那么服务端知道这些信息就够了。
服务端会利用这个类为每个聊天个体构造一个对象,从而保存下所有聊天个体的必要信息。
对于客户端,定义这样一个类:
class CPeer
{
unsigned int PeerID;
CString NickName;
CString Dialog;//保存与该类的对象的聊天记录。
};
差不多就这样了。
然后预告一下下期节目:
1.socket网络编程。
2.我们用MFC编写windows平台的可视化程序。
SDK:Visual Studio 2010
语言:C/C++
服务端的属性与工作:
服务端需要一个固定的公网IP和端口;
记录每个客户端的连接信息;
新用户上线时服务端通知其他所有客户端有新用户上线,并且把其他所有用户的信息送到新上线的这个客户端;
转发客户端之间的消息;
定时更新每个用户的上下线状态;
客户端:
以UDP报文的方式告诉给服务器端它选择的聊天对象以及消息内容;
由于是UDP方式,需要定时刷新与服务端的连接;
保存聊天记录。
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。