VC学习1: 函数返回类实例的方法
来源:互联网 发布:手机短信修改软件 编辑:程序博客网 时间:2024/06/10 17:44
由于刚学习C++, 一个很傻的错误等到一点多才解决, 函数需要返回一个CStringArray的类型, 刚开始我是这样写的:
CStringArray Printers::getPrinters(){CStringArray lvRet;DWORD dwSize, dwPrinters;::EnumPrinters(PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL, NULL, 5, NULL, 0, &dwSize, &dwPrinters);BYTE *pBuffer = new BYTE[dwSize];::EnumPrinters(PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL, NULL, 5, pBuffer, dwSize, &dwSize, &dwPrinters);//CStringArray lvRet;// = new CStringArray();CString sPrinter;if (dwPrinters != 0){lvRet.RemoveAll();lvRet.SetSize(dwPrinters);PRINTER_INFO_5 *pPrnInfo = (PRINTER_INFO_5 *)pBuffer;for (unsigned int i = 0; i <dwPrinters; i++){sPrinter.Format(_T("%s"), pPrnInfo->pPrinterName);lvRet[i] = sPrinter;pPrnInfo++;//指针后移}}delete[]pBuffer;return lvRet;}
调用:
Printers lvPrinters;CStringArray lvItems = lvPrinters.getPrinters();
结果编译不通过, 显示:
Error 1 error C2248: 'CObject::CObject' : cannot access private member declared in class 'CObject'e:\vs2013\vc\atlmfc\include\afxcoll.h 590 1 MFCApplication3
查了很久, 最后发现类的实例不能用函数直接返回, 于是改为传址参数的方法样就可以了:
bool Printers::getPrinters(CStringArray& pvOut){DWORD dwSize, dwPrinters;::EnumPrinters(PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL, NULL, 5, NULL, 0, &dwSize, &dwPrinters);BYTE *pBuffer = new BYTE[dwSize];::EnumPrinters(PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL, NULL, 5, pBuffer, dwSize, &dwSize, &dwPrinters);//CStringArray lvRet;// = new CStringArray();CString sPrinter;if (dwPrinters != 0){pvOut.RemoveAll();pvOut.SetSize(dwPrinters);PRINTER_INFO_5 *pPrnInfo = (PRINTER_INFO_5 *)pBuffer;for (unsigned int i = 0; i <dwPrinters; i++){sPrinter.Format(_T("%s"), pPrnInfo->pPrinterName);pvOut[i] = sPrinter;pPrnInfo++;//指针后移}}delete[]pBuffer;return true;}
调用:
Printers lvPrinters;CStringArray lvItems;lvPrinters.getPrinters(lvItems);
试了一下,还可能用指针的方法直接返回:
CStringArray* Printers::getPrinters(){CStringArray* lvRet = new CStringArray();getPrinters(*lvRet);return lvRet;}bool Printers::getPrinters(CStringArray& pvOut){DWORD dwSize, dwPrinters;::EnumPrinters(PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL, NULL, 5, NULL, 0, &dwSize, &dwPrinters);BYTE *pBuffer = new BYTE[dwSize];::EnumPrinters(PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL, NULL, 5, pBuffer, dwSize, &dwSize, &dwPrinters);//CStringArray lvRet;// = new CStringArray();CString sPrinter;if (dwPrinters != 0){pvOut.RemoveAll();pvOut.SetSize(dwPrinters);PRINTER_INFO_5 *pPrnInfo = (PRINTER_INFO_5 *)pBuffer;for (unsigned int i = 0; i <dwPrinters; i++){sPrinter.Format(_T("%s"), pPrnInfo->pPrinterName);pvOut[i] = sPrinter;pPrnInfo++;//指针后移}}delete[]pBuffer;return true;}
调用:
CStringArray* lvItems = lvPrinters.getPrinters();for (int i = 0; i < (*lvItems).GetCount(); i++){cb_printers.AddString((*lvItems).GetAt(i));}if (cb_printers.GetCount()>0){cb_printers.SetCurSel(0);}delete lvItems; //因为前面函数里面是显式的new了一个对象,这里需要手动删除它
0 0
- VC学习1: 函数返回类实例的方法
- VC:返回指向函数的指针
- 返回到某个VC 的方法
- 函数返回多个值的方法;
- 关于实例方法的值返回问题
- Java返回泛型的方法-实例
- VC音频函数的介绍-附实例
- VC访问数据库技术的方法实例(转)
- VC访问数据库技术的方法实例
- go函数(方法)返回值是有返回值的函数
- VC中函数返回值的存放与传递
- VC++ .Net 实例学习
- tabBar点击事件以及返回跟vc的监控方法
- shell 函数返回值的方法
- shell函数返回字符串的方法
- C函数实现返回多个值的方法
- C语言函数返回多个值的方法
- C语言函数返回多个值的方法
- 不正经运维狗的文档9
- uva548 -- Tree
- 进阶篇:等待多个子线程完毕再执行主线程的方法之CountDownLatch(十二)
- GDOI2017模拟04.12总结
- 二叉树的基本操作(五)——2-3树的概念
- VC学习1: 函数返回类实例的方法
- 用java实现数据挖掘中的向量求相似度
- M/在Makefile中进行宏定义-D
- SAS驱动中PHY和PORT的介绍
- ACM Fibonacci数
- css样式大全
- C语言设计24点游戏。
- 【hibernate】hibernate中的各种问题
- web导入excel(利用POI解析)