一、獲得返回值:
可以作為函數的一個參數
比如定義fun(CArray<int, int &> &array)
采用引用類型,就可以直接使用
二、作為函數參數:
#include<Afxtempl.h> //定義函數。 void ansnode(int num,CArray<double,double&> m_adX, CArray<double,double&> m_adY, CArray<double,double&> m_adZ);
函數體:
void ansysdata::ansnode(int num,CArray<double,double&> *m_adX, CArray<double,double&> *m_adY, CArray<double,double&> *m_adZ) { double x, y,z; int i; fstream infilex; fstream infiley; fstream infilez; infilex.open("d:/intface/M_ADX.TXT.txt",ios::in); infiley.open("d:/intface/M_ADX.TXT.txt",ios::in); infilez.open("d:/intface/M_ADX.TXT.txt",ios::in); for (i=0;i<num;i++) { infilex>>x; infiley>>y; infilez>>z; m_adX.Add(x); m_adY.Add(y); m_adZ.Add(z); } fstream outfilex; fstream outfiley; fstream outfilez; outfilex.open("d:/intface/M_ADX1.TXT.txt",ios::in); outfiley.open("d:/intface/M_ADX2.TXT.txt",ios::in); outfilez.open("d:/intface/M_ADX3.TXT.txt",ios::in); for (i=0;i<num;i++) { outfilex<<m_adX.GetAt(i)<<endl; outfiley<<m_adY.GetAt(i)<<endl; outfilez<<m_adZ.GetAt(i)<<endl; } }
三、CArray結構體中的應用
struct DriverItem { CString strDriverName; CString strProductDescribe; CString strTBLFileName; }; struct ControlItem { CString strControlType; CArray <DriverItem,DriverItem&> DriverArray; };
四、CArray的簡單說明
CArray <Object,Object> Var1;
CArray <Object,Object&> Var2;
第一個參數是CArray的返回的參數,第二個參數是傳遞給CArray的參數。即,當使用第二種形式定義Carray數組時,使用Add()時是一個引用類型的參數。
五、轉帖
最近一直在編寫一個繪圖程序,為了保存多個double型點坐標,這裡我采用了定義集合類CArray<TYPE, ARG_TYPE>CPointDArray來保存多點,然後定義坐標轉換函數ConvertToXYs(CPointDArray,long* xy),將double坐標轉換為long型坐標,這是就出現幾種常見錯誤,"CPointDArray缺少構造函數,或者是拷貝構造函數不存在”,‘不能將參數 1 從“CArray<TYPE,ARG_TYPE>”轉換為“CArray<TYPE,ARG_TYPE>”,從這兩個問題入手,舉例說明問題。
下面代碼為我修改多次後總結的一個實例,照著此方法可以推廣:
1.建立一個VC6工程 ,在CTestView中,添加一個OnLButtonDown,在這裡實現點的繪制。
2.在CTestView.h中,自定義double類型的點類以及數組
class CPointD { public: double x; //longtitude double y; //latitude CPointD() { x =0; y=0; }; CPointD(const double dx,double dy) { x = dx; y = dy; }; CPointD(const CPointD& pnt) { x = pnt.x; y = pnt.y; }; CPointD& operator=(const CPointD& rhs) { if (this == &rhs) { return *this; } x = rhs.x; y = rhs.y; return *this; } };//double 型指針鏈表 typedef CArray<CPointD,CPointD>CPointDArray; //double 型數組 typedef CArray<POINT,POINT&>LPointArray;//long型數組
注意這裡CArray<CPointD,CPointD>可以用CArray<CPointD*,CPointD*>,實驗證明沒有問題。
3.在視圖類CTestView定義全局變量CPointDArray plist;
定義函數void ConvToXYs(const CPointDArray &alist, LPointArray& llist);//&alist為常應用,保存函數中不修改數據,&llist是alist轉
//換成long後的數組。這裡就是出現上述常見問題的症結。
下面為實現部分
void CTestLineView::ConvToXYs(const CPointDArray &alist, LPointArray& llist) { if (alist.GetSize()>0) { llist.RemoveAll(); int i ; int n = alist.GetSize(); llist.SetSize(n); double jing, wei; for(i=0;i<n;i++) { CPointD p = alist.GetAt(i); jing = p.x; wei = p.y; llist[i].x = (long)(jing+0.5);//這是關鍵步驟,可以當數組用 llist[i].y = (long)(wei+0.5);// }
4.在鼠標左鍵事件中實現繪制:
void CTestLineView::OnLButtonDown(UINT nFlags, CPoint point) { CClientDC pDC(this); try { CPen* pOldPen = (CPen*)pDC.SelectStockObject(2); for (int i=0;i<10;i++) { // CPointD *p=new CPointD(i*3.5f,i*5.5f); plist.Add(CPointD(i*3.5f,i*5.5f)); } LPointArray longpoints; ConvToXYs(plist,longpoints); pDC.Polyline(longpoints.GetData(),plist.GetSize()); CString str; str.Format("%d",longpoints.GetSize()); AfxMessageBox(str,MB_OK); // Restore the original device context objects. pDC.SelectObject(pOldPen); } catch (CException* e) { LPTSTR lp="" ; e->GetErrorMessage(lp,250); AfxMessageBox(lp); } CView::OnLButtonDown(nFlags, point); }
最後在~CTestLineView中清除plist。
CTestLineView::~CTestLineView() { if(plist.GetSize()) plist.RemoveAll(); }
大概就這麼多了,通過學習,希望能夠給大家一個思路,將來能夠很娴熟的應用CArray。
http://blog.csdn.net/eattonton/article/details/5278540
本文出自 “驿落黃昏” 博客,請務必保留此出處http://yiluohuanghun.blog.51cto.com/3407300/1118301