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。
PtDate
是一个结构体,而不是CArray
。所以,首先要将 CArray <PtDateStruct, PtDateStruct&> PtDateArray
改为 CArray <PtDate, PtDate&> PtDateArray
。typedef CArray <PtDate, PtDate&> PtDateArray;
在你的代码中,定义了一个结构体PtDateStruct。PtDateStruct有一个默认的构造函数和一个接受两个字符串参数的构造函数。
声明一个CArray对象 PtDateArray
,用于存储PtDateStruct类型的数据。
PtDateArray m_PtDate;
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;
}
希望以上解决方案对你有所帮助。如果还有其他问题,请随时提问。