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
原创粉丝点击