找回密码
 注册
Simdroid-非首页
查看: 134|回复: 1

[2. C/C++/C#] 请教VC一个类串行化(Serialize)的问题

[复制链接]
发表于 2005-3-18 10:44:48 | 显示全部楼层 |阅读模式 来自 吉林长春
我自己定义了一个矩阵类,其功能实现矩阵运算。
矩阵类的头文件如下:
class CMatrix  : public CObject
{
  DECLARE_SERIAL(CMatrix)
//attributes
private:
    int rows,cols; //行和列
    double * elems; //存储矩阵元素值
//implementation
public:
    CMatrix();
    virtual ~CMatrix();
    CMatrix(int,int);
    CMatrix(CMatrix &matrix);
//storing
    virtual void Serialize(CArchive &ar);
//operation
public:
    ......//省略一些函数

    //实现动态赋值  //此函数会改变矩阵类行和列,矩阵所分配的内存也会发生变化
    CMatrix &equal(CMatrix mat);
};
矩阵类的cpp文件如下:
#include "Matrix.h"
IMPLEMENT_SERIAL(CMatrix,CObject,1)
CMatrix::CMatrix()
{
    this->rows=1;
    this->cols=2;
    this->elems=new double[rows*cols];
    for (int i=0;i<rows*cols;i++)
        elems=0.0;
}
CMatrix::~CMatrix()
{
    delete []elems;
}
CMatrix::CMatrix(int rows,int cols)
{
  CMatrix::rows=rows;
  CMatrix::cols=cols;
  elems=new double[rows*cols];
  for (int i=0;i<rows*cols;i++)
    elems=0.0;
}
///////////////////////////////////////////////////////
//storing 我写的序列化函数,请帮忙看看错误在那?
void CMatrix::Serialize(CArchive &ar)
{
  CObject::Serialize(ar);
  //
  int i;
  if(ar.IsStoring())
  {
      ar<<rows<<cols;
      for(i=0;i<rows*cols;i++)
          ar<<elems;
  }
  else
  {
      ar>>rows>>cols;
      for(i=0;i<rows*cols;i++)
      ar>>elems;
  }
}
//此函数会改变矩阵类行和列,矩阵所分配的内存也会发生变化
CMatrix &CMatrix::equal(CMatrix mat)
{
  delete []elems;
  rows=mat.GetRows();
  cols=mat.GetCols();
  elems=new double[rows*cols];
  for (int i=0;i<rows*cols;i++)
    elems=mat.elems;
  return *this;
}
以上是定义的矩阵类。
在我的工程(SimMount)当中,文档类(CSimMountDoc)中有一个矩阵类数据,文档类的
头文件如下:
class CSimMountDoc : public CDocument
{
public:
    CMatrix m_matEnergy;//我的矩阵类型数据
//其余函数省略
}
文档类的CPP文件如下:
CSimMountDoc::CSimMountDoc():m_matEnergy(6,6)//在这里对我的矩阵类型数据进行了初始化,不知道有没有错误?,还是应该放在OnNewDocument()中初始化?
{
}
BOOL CSimMountDoc::OnNewDocument()
{
    if (!CDocument::OnNewDocument())
  return FALSE;
    // TODO: add reinitialization code here
    // (SDI documents will reuse this document)

    return TRUE;
}
void CSimMountDoc::Serialize(CArchive& ar)
{
    m_matEnergy.Serialize(ar);
    if (ar.IsStoring())
    {
        // TODO: add storing code here
    }
    else
    {
        // TODO: add loading code here
    }
}
//在下面这个函数中是否应该把m_matEnergy里面的指针元素给清除掉?
//这里面应该怎样编写程序?
void CSimMountDoc:eleteContents()
{
    // TODO: Add your specialized code here and/or call the base class
    CDocument::DeleteContents();
}
这个矩阵数据m_matEnergy开始初始化时,为六行六列的一个矩阵,但在软件运行后,在不同情况下,他的行和列都可能发生改变,从而矩阵所申请的内存也会发生改变(通过矩阵类的成员函数:CMatrix::equal(CMatrix mat)来改变)。不知道这个类怎么串行化?这个类在什么地方初始化?CSimMountDoc::DeleteContents()这个函数中是不是应该消除矩阵申请的内存?因为执行 菜单/打开或新建 时会调用CSimMountDoc::DeleteContents()这个函数。
希望各位高手给与指导,将十分感谢!
whedward 该用户已被删除
发表于 2005-3-25 13:11:46 | 显示全部楼层 来自 湖北武汉
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-11-1 23:29 , Processed in 0.046823 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表