VC++几个让个迷惑的问题!!!

rommayer 2009-08-24 01:14:50
有一年多没有弄VC++了,近来想做一个小软件,重新拿了起来,却发现自己越来越对它不熟悉了。做了将近两年的NET开发,对VC++这种模式还真的不太适应了。。。发现了一些问题,弱弱的问题,希望大家多多指教。。。。。。
对于CSocket 类,大家一般怎么使用? 定义一个 CSocket 类的对象:
CSocket ss;
然后就可以用这个对象来做事了,比如调用它的Send()方法发送数据,调用它的其它方法来进行我们要做的事情。现在问题出来了,我要用这个对象与别人进行通信,当别人发送信息给我这个套接字时,ss对象如何来接收这些信息。我们知道,CSocket类有一个 Receive()方法,可以用它来接收对方发来的信息。
问题是,我们什么时候调用Receive()方法来接收对方发来的信息。我们知道CSocket有个虚函数 OnReceive(),我们必须依靠这个虚函数来通知我们,什么时候调用Receive()方法接收信息。
这个虚函数,是要我们来重写的,否则Receive()这个方法没有地方可写。。。。看了别人N多的程序,大家都这是么写的:新建一个类,如CMySocket,这个类继承CSoket。并且在这个类里面新建一个指向程序主对话框的指针,(在CMySocket的构造函数里,初始化这个指针)。然后在CMySocket里重写OnReceive()这个虚函数,并且在OnReceive()里调用主对话框的一个函数,如主对话框的 OnReceive(),在主对话框中,编写我们的具体接收信息的方法。。。。。
对于这种访式的调用,本人十分迷惑。。。。。。
1.既然CSocket 是MFC封装好的一个类,为什么我们不能直接使用这个类进行网络连接,接收数据,而必须自己继承这个类,用继承的类来构造自己的对象。
可不可以,直接用CSocket,而不用继承它,来实现上面的功能呢?
2.我们用CMysocket继承了CSocket,并且我们在CMysocket类里面,保存了一个指向主对话框的指针,以便在重写Onreceive 时,调用主对话框的OnReceive函数。这样一来,我们的这个CMySocket类与主对话框,是紧密联系在一起的,它们有很强的偶合关系。
这样,这个CMysocket类就只能在主对话框内使用,如果我们新建了另外一个对话框,在这个对话框内我们也需要Socket连接,那么就不能用CMySocket这个类。
而且还有一个问题,假如,我们在主对话框内,要定义两个套接字对象,而且这两个对象在接收数据时,都有不同的操作。那么我们就不能把这两个对象都定义成CMySocket,因为这两个套接字对象的OnReceive事件里面所做的事情是不同的,它们不能共用同一个类的同一个函数。(当然我们可以想一些其它办法来解决这个问题,比如,在CMySocket里面添加一个字段 m_name,给每一个定义的对象取一个名字,这样在OnReceive()里面根据名字来做不同的事情)。

好了,跟据上面的论述,我们可以将它总结为:要使用CSocket 这个类,我们必须继承它,将它继承为CMysocket;如果我们的程序里使用到了多个套接字,而且这些套接字在接收数据时都要做不同的事情,那么我们就必须将CSocket继承为CMysocket1,CMysocket2,CMysocket3。。。。。。也就是一个类如CMysocket只能定义一个象。。。。。
在面向对象里,这是多么可笑的结论,CSocket类是一个类,我们不能用它来做事情(除了继承它)!
CMySocket是我们继承CSocket的一个类,我们不能用它来定义多个对象!如果我们想定义多个对象,我们必须为这些对象写n多个类。。。。。。。
这不是很荒唐吗?
期等高手正解!
等待中。。。。。。


...全文
211 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
rommayer 2009-08-26
  • 打赏
  • 举报
回复
学习,学习
rommayer 2009-08-26
  • 打赏
  • 举报
回复
以前弄过,但没用它做过项目
副组长 2009-08-26
  • 打赏
  • 举报
回复
1. 要使用CSocket 这个类,我们必须继承它,。。。
其实这是优点不是缺点,为了更灵活的使用CSocket就从这里派生,并且必须派生。

2. 如果我们的程序里使用到了多个套接字,而且这些套接字在接收数据时都要做不同的事情,那么我们就必须将CSocket继承为CMysocket1,CMysocket2,CMysocket3。。。。。。
===============================
不是这个样子的,你可以只派生一个类,每一个连接用一个实例化对象与之对应,假如你有10000个连接,每一个连接创建一个堆对象,将所有的对象指针存在一个指针列表里面就可以检索和使用了。
至于你说的每个Socket做不同的事情,它本来的基本功能就是收发,针对不同的连接,它能把接受来的不同功能分出去,把别人委托来的信息发给对方,就是作为一个Socket的基本任务了。
慢慢体验类封装和面向对象吧,比API有更多的优势,至少我是这么认为。
secretcf 2009-08-26
  • 打赏
  • 举报
回复
CSocket的优势是基于事件处理,使用简便。劣势:必须在主线程中创建CSocket来捕捉事件,对于客户端数量比较少,通信量不过于频繁的通信情况比较适用.
高性能服务器就不适合用CSocket来设计,应用socket API, 或是IOCP.
jyh_baoding 2009-08-26
  • 打赏
  • 举报
回复
可以在网上查个例子,弄明白再做
  • 打赏
  • 举报
回复
同感 我用得比较多是 SOCKET API
lizmei001 2009-08-25
  • 打赏
  • 举报
回复
有一年多没有弄VC++了?有点怀疑楼主以前弄过没有
Zhurikeji 2009-08-25
  • 打赏
  • 举报
回复
学协中,帮顶
rommayer 2009-08-24
  • 打赏
  • 举报
回复
原来分少了,难怪人不多来顶
rendao0563 2009-08-24
  • 打赏
  • 举报
回复
这么多字就给10分。
Conry 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 rommayer 的回复:]
引用 3 楼 conry 的回复:
所以说你这样定义CMySocket 有问题啊
你里面就定义一个数据链表,一个hwnd,OnRecive接收数据就插入链表,发送消息给hwnd,让他来取数据
更通用一点,定义一个void指针,想怎么转换都行


有道理,不知道,你平时是怎么做的,这个问题是一个代表性问题。。。
[/Quote]
很少用MFC的socket类
有时用自己封装的socket类
有时直接用socket API
rommayer 2009-08-24
  • 打赏
  • 举报
回复
对C++的虚函数,理解不够透彻。。。。。。
rommayer 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 conry 的回复:]
所以说你这样定义CMySocket 有问题啊
你里面就定义一个数据链表,一个hwnd,OnRecive接收数据就插入链表,发送消息给hwnd,让他来取数据
更通用一点,定义一个void指针,想怎么转换都行
[/Quote]

有道理,不知道,你平时是怎么做的,这个问题是一个代表性问题。。。
glacierful 2009-08-24
  • 打赏
  • 举报
回复
用Sokcet API写吧。
Conry 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 rommayer 的回复:]
引用 1 楼 conry 的回复:
1 有待于确认
2 这种用法本来就有问题,CMySocket应该只接收数据,不做处理,谁要处理谁就来要数据,就不存在你说的 问题了


问题是CMySocket 里面有一个对话框指针,这个指针的类型是写死了的,也就是CMySocket只能在这个对话框内使用了。。。。
[/Quote]
所以说你这样定义CMySocket 有问题啊
你里面就定义一个数据链表,一个hwnd,OnRecive接收数据就插入链表,发送消息给hwnd,让他来取数据
更通用一点,定义一个void指针,想怎么转换都行
rommayer 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 conry 的回复:]
1 有待于确认
2 这种用法本来就有问题,CMySocket应该只接收数据,不做处理,谁要处理谁就来要数据,就不存在你说的 问题了
[/Quote]

问题是CMySocket 里面有一个对话框指针,这个指针的类型是写死了的,也就是CMySocket只能在这个对话框内使用了。。。。
Conry 2009-08-24
  • 打赏
  • 举报
回复
1 有待于确认
2 这种用法本来就有问题,CMySocket应该只接收数据,不做处理,谁要处理谁就来要数据,就不存在你说的 问题了
【前言】 工作或学习中可能需要实现基于VC读\写Excel文件的功能,本人最近也遇到了该问题。中间虽经波折,但是最终还是找到了解决问题的办法。 在此跟大家分享,希望对跟我同样迷茫过的同学们有所帮助。 1、程序功能 1)打开一个excel文件; 2)显示到CListCtrl上; 3)新建一个Excel文件。 以上均在对话框中实现。 2、平台 VC++2010 3、实现方法 常用的Excel打开方式有两种 1)通过数据库打开; 2)OLE方式打开。 由于方式1)操作繁琐,经常出现莫名的错误,这里选用方式2). 4、准备步骤 首先新建一个Dialog窗体程序,添加list control和两个按钮 1)将ExcelLib文件夹拷贝到程序目录下; 2)将Export2Excel.h,Export2Excel.cpp两个文件添加到项目; 3)包含头文件,#include "ExcelLib/Export2Excel.h" 通过以上步骤在程序中引入了可以读取Excle文件的CExport2Excel类; 5、打开excel文件 通过按钮点击打开 void CExcelTestDlg::OnBnClickedButtonOpenExcel() { //获取文件路径 CFileDialog* lpszOpenFile; CString szGetName; lpszOpenFile = new CFileDialog(TRUE,"","",OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,"Excel File(*.xlsx;*.xls)|*.xls;*.xlsx",NULL); if (lpszOpenFile->DoModal()==IDOK) { szGetName = lpszOpenFile->GetPathName(); SetWindowText(szGetName); delete lpszOpenFile; } else return; //打开文件 //文件中包含多个sheet时,默认打开第一个sheet CExport2Excel Excel_example; Excel_example.OpenExcel(szGetName); //获取sheet个数 int iSheetNum = Excel_example.GetSheetsNumber(); //获取已使用表格行列数 int iRows = Excel_example.GetRowCount(); int iCols = Excel_example.GetColCount(); //获取单元格的内容 CString cs_temp = Excel_example.GetText(1,1); //AfxMessageBox(cs_temp); //List control上显示 //获取工作表列名(第一行) CStringArray m_HeadName; m_HeadName.Add(_T("ID")); for (int i=1;iGetItemCount()>0) { m_list.DeleteColumn(0); } //初始化ClistCtrl,加入列名 InitList(m_list,m_HeadName); //填入内容 //第一行是标题,所以从第2行开始 CString num; int pos; for (int row = 2;row<=iRows; row++) { pos = m_list.GetItemCount(); num.Format(_T("%d"),pos +1); m_list.InsertItem(pos,num); for (int colum=1;columDoModal()==IDOK) { szGetName = lpszOpenFile->GetPathName(); SetWindowText(szGetName); delete lpszOpenFile; } else return; //文件全名称 CString csFileName = szGetName; //需要添加的两个sheet的名称 CString csSheetName = "newSheet"; CString csSheetName2 = "newSheet2"; // 新建一个excel文件,自己写入文字 CExport2Excel Excel_example; //新建excel文件 Excel_example.CreateExcel(csFileName); //添加sheet,新加的sheet在前,也就是序号为1 Excel_example.CreateSheet(csSheetName); Excel_example.CreateSheet(csSheetName2); //操作最开始添加的sheet:(newSheet) Excel_example.SetSheet(2); //添加表头 Excel_example.WriteHeader(1,"第一列"); Excel_example.WriteHeader(2,"第二列"); //添加核心数据 Excel_example.WriteData(1,1,"数据1"); Excel_example.WriteData(1,2,"数据2"); //保存文件 Excel_example.Save(); //关闭文件 Excel_example.Close(); } 7、注意事项 1)一般单个Excel文件包含多个sheet,程序默认打开第一个; 2)指定操作sheet,使用Excel_example.SetSheet(2)函数; 3)打开文件时最左侧的sheet序号为1,新建excel时最新添加的sheet序号为1. 【后记】 本程序主要基于网络CSDN中---“Excel封装库V2.0”---完成,下载地址是:http://download.csdn.net/detail/yeah2000/3576494,在此表示感谢!同时, 1)在其基础上作了小改动,改正了几个小错误,添加了几个小接口; 2)添加了如何使用的例子,原程序是没有的; 3)详细的注释 发现不足之处,还请大家多多指教!

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧