【问题标题】:C++ MFC Serializre(CArchive &ar) with CArray<class*, class*>C++ MFC Serializre(CArchive &ar) 与 CArray<class*, class*>
【发布时间】:2014-12-14 23:02:02
【问题描述】:

我有一个程序,可以绘制形状:菱形、正方形、矩形、直线、圆形……在 Microsoft 中与 Paint 相同。 我的问题是使用 Serialize(CArchive &) 保存和加载文件,但使用 CArray 时无法保存和加载文件。我该怎么做:

class BaseShape : public CObject
{
    DECLARE_SERIAL(BaseShape)
public:
    CPoint topLeft, bottomRight;
    COLORREF m_clrBack;
    EShapeType m_ShapeType;  //enum type of shape
public:
    BaseShape(void);  //empty method
    BaseShape (CPoint , CPoint, COLORREF, EShapeType);
    ~BaseShape(void);
    virtual void DrawShape (CDC*);  //empty method
    void Serialize(CArchive& ar);
};

实现BaseShape类的Serialize(CArchive&ar):

IMPLEMENT_SERIAL(BaseShape, CObject, 1)
void BaseShape::Serialize(CArchive& ar)
    {
        if (ar.IsStoring())
        {
            ar << topLeft << bottomRight << m_clrBack << m_ShapeType;
        }
        else
        {
            int temp_shape;
            ar >> topLeft >> bottomRight >> m_clrBack >> temp_shape;
            m_ShapeType = (EShapeType)temp_shape;
        }
    }

Square 类和 Lozenge 类是 BaseShape 派生的:

class CSquare : public BaseShape
{
public:
    CSquare(void);
    CSquare (CPoint , CPoint, COLORREF, EShapeType);
    ~CSquare(void);
    void DrawShape(CDC*);
};

在 MFC 文档类中,我有:

//declare properties
  CArray<BaseShape*, BaseShape*> m_arrShape;
        COLORREF m_clrBack;
        EShapeType m_ShapeType;

//implement method

void CdemoDoc::Serialize(CArchive& ar)
{
    if (ar.IsStoring())
    {
        int i;
        ar << m_arrShape.GetSize();
        for (i = 0; i <m_arrShape.GetSize(); i++)
            ar << m_arrShape[i];
    }
    else
    {
        int ncount, i;
        ar >> ncount;
        m_arrShape.RemoveAll();
        for (i = 0; i < ncount; i++)
        {
            BaseShape* pShape = new BaseShape();
            ar >> pShape;
            m_arrShape.Add(pShape);
        }

在我的代码上面,当我点击打开文件时,没有显示之前绘制的形状,虽然我的代码没有错误,但我保存数据文件不确定是否成功。我不明白“isloading()”函数的代码行是如何工作的。还有另一种方法吗?这是我所有项目的源代码:http://www.mediafire.com/download/jy23ct28bgqybdc/demo.rar

【问题讨论】:

  • 您实际上并没有告诉我们问题出在哪里。是编译问题、链接问题还是运行时问题?
  • 我无法在 MFC 文档/视图应用程序中通过序列化 (CArchive &) 方法保存和加载文件。
  • 但是具体是什么问题呢?你调试了吗?
  • 是的,我有!我正在运行我的项目,它仍然绘制形状,但我无法加载文件,当我单击打开文件时保存了该文件
  • 您可以下载我的项目进行调试

标签: c++ arrays visual-c++ serialization mfc


【解决方案1】:

原因很简单:您不能创建 BaseShape 对象并期望它在加载时被专门化。

诀窍是 ar

请阅读MSDN about CObject serializing...以及Scribble 示例和其他内容。

if (ar.IsStoring())
{
  int i;
  ar << m_arrShape.GetSize();
  for (i = 0; i <m_arrShape.GetSize(); i++)
    ar << m_arrShape[i];
}
else
{
  int ncount, i;
  ar >> ncount;
  m_arrShape.RemoveAll();
  for (i = 0; i < ncount; i++)
  {
    BaseShape *pNewShape;
    ar >> pNewShape;
    m_arrShape.Add(pNewShape);
  }
}

PS:如果您提供示例代码,它应该与您问题中的代码匹配。

【讨论】:

  • 你不明白我的问题。 BaseShape 像抽象类,我想保存继承类的数据。而我做不到!
  • 我完全明白了!当 m_arrShape 包含专用类的对象时,ar>>pNewShape 将创建派生类。请将适当的 DECLARE_SERIAL/IMPLEMENT 处理程序添加到您的专业课程中。请阅读我给你的链接!!!!
  • 确定您没有使用旧文件?重新声明类后重新编写文件。
  • 在您的链接中,我不了解嵌入式类,它的用途是什么?在我的项目中,我没有那个类类型,我有 2 个类继承自 BaseShape 类。
  • 我在Document类的实现文件中声明了IMPLEMENT_SERIAL,没关系。但是我运行项目来检查,我画了新文件来保存,我点击打开它通知“意外的文件格式”。为什么系统显示?
猜你喜欢
  • 2021-11-19
  • 1970-01-01
  • 2016-08-28
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
相关资源
最近更新 更多