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();
}



     本文转自 驿落黄昏 51CTO博客,原文链接:http://blog.51cto.com/yiluohuanghun/1118301,如需转载请自行联系原作者

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值