whj_hbxf 2023-08-08 21:19 采纳率: 50%
浏览 5

关于CArray和结构体使用的问题,求大獅指导。

h文件


#pragma once

typedef struct PtDateStruct {
    static CString mName;
    static CString mAddress;
    PtDateStruct::PtDateStruct() {

    }
    PtDateStruct::PtDateStruct(PtDateStruct& _Pt) {
        mName = _Pt.mName;
        mAddress = _Pt.mAddress;
    }
    PtDateStruct::PtDateStruct(CString x, CString y) {
        mName = x;
        mAddress = y;
    }
}PtDate;
typedef CArray <PtDateStruct, PtDateStruct&> PtDateArray;

class CFileHandles
{
public:
    CFileHandles();   // 标准构造函数
    virtual ~CFileHandles();
public:
    CString GetModuleDir();
    CString PtFileRead();
    wchar_t* charTOwchar(char* cchar);
    CArray <PtDateStruct, PtDateStruct&> GetPtDate();
};

cpp文件

CArray <PtDate, PtDate&> CFileHandles::GetPtDate()
{
    PtDateArray m_PtDate;
    PtDate pd;
    CString m_ptConfig = PtFileRead();
    CStringArray* m_result = new CStringArray;
    while (TRUE) {
        int tag = m_ptConfig.Find(L"\r\n");
        if (tag == -1) {
            break;
        }
        CString test1 = m_ptConfig.Left(tag);
        m_result->Add(test1);
        m_ptConfig = m_ptConfig.Right(m_ptConfig.GetLength() - tag - 1);
    }
    for (int i = 0; i < m_result->GetSize(); i++) {
        CString str = m_result->GetAt(i);
        str.TrimLeft();
        str.TrimRight();
        //MessageBox(str);

        int tags = str.Find(L"|");
        if (tags != -1) {
            
            CString strL = str.Left(tags);
            CString strR = str.Right(str.GetLength() - tags - 1);
            pd.mName = strL;
            pd.mAddress = strR;
            m_PtDate.Add(pd);
        }
    }
    return m_PtDate;
}

问题:“return m_PtDate;”这句报错:严重性 代码 说明 项目 文件 行 禁止显示状态
错误(活动) E1776 无法引用 函数 "CArray<TYPE, ARG_TYPE>::CArray(const CArray<PtDateStruct, PtDateStruct &> &) [其中 TYPE=PtDateStruct, ARG_TYPE=PtDateStruct &]" (已隐式声明) -- 它是已删除的函数

求指导。

  • 写回答

2条回答 默认 最新

  • bostonAlen 2023-08-08 22:31
    关注

    返回 CArray 需要CArray 的拷贝构造函数,
    而 CArray 基于 CObject,CObject 禁止的,它的拷贝构造函数是私有的,这里CArray 本身也没实现拷贝构造函数。
    这里你可以改成 :

    GetPtDate(PtDateArray& m_PtDate)
    {
        PtDate pd;
        CString m_ptConfig = PtFileRead();
        CStringArray* m_result = new CStringArray;
        while (TRUE) {
            int tag = m_ptConfig.Find(L"\r\n");
            if (tag == -1) {
                break;
            }
            CString test1 = m_ptConfig.Left(tag);
            m_result->Add(test1);
            m_ptConfig = m_ptConfig.Right(m_ptConfig.GetLength() - tag - 1);
        }
        for (int i = 0; i < m_result->GetSize(); i++) {
            CString str = m_result->GetAt(i);
            str.TrimLeft();
            str.TrimRight();
            //MessageBox(str);
     
            int tags = str.Find(L"|");
            if (tags != -1) {
                
                CString strL = str.Left(tags);
                CString strR = str.Right(str.GetLength() - tags - 1);
                pd.mName = strL;
                pd.mAddress = strR;
                m_PtDate.Add(pd);
            }
        }
    }
    

    据说MFC这么设计的原因是:
    为了防止在CObject的派生类中出现与“浅拷贝和深拷贝”相关的错误。如果我们想在CObject的派生类中使用这两个函数,就必须在派生类中去真正实现它们。因此拷贝构造函数和赋值运算符重载函数在CObject只进行了声明而并没有去真正实现它们。只要我们的程序不去调用CObject类的这两个函数,那么程序就不会报错。一旦我们在程序中调用了这两个函数中的某一个,程序立马就会报错。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 8月8日

悬赏问题

  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害