关于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 &]" (已隐式声明) -- 它是已删除的函数

求指导。

返回 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类的这两个函数,那么程序就不会报错。一旦我们在程序中调用了这两个函数中的某一个,程序立马就会报错。

【以下回答由 GPT 生成】

关于使用CArray和结构体(PtDateStruct)的问题,下面是具体解决方案。

首先,我们来解释一下函数GetPtDate的作用。这个函数是一个成员函数,声明在CFileHandles类中。它的作用是从文件中读取一些配置信息,将这些信息存储在一个CArray中,并返回该CArray。

CArray <PtDate, PtDate&> CFileHandles::GetPtDate()

现在来回答如何使用CArray和PtDateStruct。

  1. 首先,在你的代码中,PtDate 是一个结构体,而不是CArray。所以,首先要将 CArray <PtDateStruct, PtDateStruct&> PtDateArray 改为 CArray <PtDate, PtDate&> PtDateArray
typedef CArray <PtDate, PtDate&> PtDateArray;
  1. 在你的代码中,定义了一个结构体PtDateStruct。PtDateStruct有一个默认的构造函数和一个接受两个字符串参数的构造函数。

  2. 声明一个CArray对象 PtDateArray,用于存储PtDateStruct类型的数据。

PtDateArray m_PtDate;
  1. 也可以使用 Add 方法将PtDate对象添加到CArray中。
PtDate pd; // 创建一个PtDate对象
m_PtDate.Add(pd); // 将PtDate对象添加到CArray中

这样,你就可以使用CArray和PtDateStruct了。

完整的修改后的代码如下:

#pragma once

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

    }
    PtDateStruct(PtDateStruct& _Pt) {
        mName = _Pt.mName;
        mAddress = _Pt.mAddress;
    }
    PtDateStruct(CString x, CString y) {
        mName = x;
        mAddress = y;
    }
}PtDate;

typedef CArray <PtDate, PtDate&> PtDateArray;

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

            // 创建一个PtDate对象并设置属性值
            PtDate data;
            data.mName = strL;
            data.mAddress = strR;

            // 将PtDate对象添加到CArray中
            m_PtDate.Add(data);
        }
    }

    // 返回CArray
    return m_PtDate;
}

希望以上解决方案对你有所帮助。如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^