MFC類庫之CArray作為函數參數和返回值
一、獲得返回值:
可以作為函數的一個參數
比如定義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