如何使用空 CArray 初始化 CArray<CClass*> 函数参数的默认值?

Posted

技术标签:

【中文标题】如何使用空 CArray 初始化 CArray<CClass*> 函数参数的默认值?【英文标题】:How can I initialize the default value of a CArray<CClass*> function parameter with an empty CArray? 【发布时间】:2015-11-13 01:03:31 【问题描述】:

我知道我可以用std::vector 做得更好,但是我正在搞砸的应用程序已经在很多相关函数上设置了一堆CArray 参数......而且我不会全部更改它们瞬间!

我只是想定义一个空的CArray&lt;CClass*&gt; — 指向CClass指针 数组,所以CClass 构造函数上的问题不能 — 如函数参数的默认值。

方法 1

如果我尝试使用 赋值运算符默认构造函数

void Function(CArray<CClass*> parameter = CArray<CClass*>());

我得到错误:

1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include\afxTempl.h(262): error C2248: 'CObject::CObject' : cannot access private member declared in class 'CObject'
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include\afx.h(535) : see declaration of 'CObject::CObject'
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include\afx.h(510) : see declaration of 'CObject'
1>          This diagnostic occurred in the compiler generated function 'CArray<TYPE>::CArray(const CArray<TYPE> &)'
1>          with
1>          [
1>              TYPE=CClass *
1>          ]

方法 2

我也尝试了复制构造函数

void Function(CArray<Class*> parameter(CArray<CClass*>()));

我得到了错误:

 >File.cpp(line X): error C2664: 'FunctionClass::Function' : cannot convert parameter 1 from 'CArray<TYPE>' to 'CArray<TYPE> (__cdecl *)(CArray<TYPE> (__cdecl *)(void))'
1>          with
1>          [
1>              TYPE=CClass*
1>          ]
1>          No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
第 X 行:包含向 Function 提供参数的调用,如图所示:pFunctionClass-&gt;Function(parameter);

1>CFunctionClass.cpp(Y 行):错误 C2511:'void CFunctionClass::Function(CArray)':在 'CShoePlaceDoc' 中找不到重载的成员函数 1> 与 1> [ 1> 类型=C类* 1>] 1> FunctionClass.h(line A) : 见 'CFunctionClass' 的声明

Y行包含Function实现头,如图:`void CFunctionClass::Function(CArray parameter)

1>File.cpp(Z 行):错误 C2660:'CClassFunction::Function':函数不接受 0 个参数

Z 行:包含对Function 的调用,但未提供参数,如图所示:pClassFunction-&gt;Function();

该方法不起作用,但它得到了一个结论:不可能使用复制构造函数为函数参数分配默认值。

方法 3

如果我尝试使用 lambda

void Function(CArray<CClass*> parameter = [] () -> CArray<CClass*> return CArray<CClass*> ();  );

,那么我会得到这两个错误的多个输出:

1>FunctionClass.h(line A): error C2440: 'default argument' : cannot convert from '`anonymous-namespace'::<lambda2>' to 'CArray<TYPE>'
1>          with
1>          [
1>              TYPE=CClass*
1>          ]
1>          No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>FunctionClass.h(line B): fatal error C1903: unable to recover from previous error(s); stopping compilation
A 行:方法声明 B 行:关闭包含Function 方法的FunctionClass 类的

问题的根源

问题的根源似乎是CArray是一个直接派生自CObject的类,它将赋值运算符声明为私有:

class AFX_NOVTABLE CObject

//...
private:
    CObject(const CObject& objectSrc);              // no implementation
    void operator=(const CObject& objectSrc);       // no implementation
//...

那么,如何提供一个空数组作为参数的默认值?

【问题讨论】:

我不确定我是否跟随。即使您可以使用复制构造函数和赋值运算符来解决问题,为什么还要它呢?最好直接访问指针。像这样的东西:void Function(CArray&lt;CClass*&gt; *p = NULL)if (p == NULL)p = Default;... 【参考方案1】:

有了这个声明

void Function(CArray<CClass*> parameter /*...*/);

你不能。如您所见,调用此函数将调用 CObject 的私​​有复制构造函数。

您可以做的是在您的类中添加一个static CArray&lt;CClass*&gt; 的对象,并使用对它的引用来初始化该函数。这样它将为空(只要您不填充它...),您可以对其执行.IsEmpty() 检查。

private:
    static CArray<CClass*> myObj;
//...
void Function(CArray<CClass*> &parameter = myObj);

或将其初始化为 0。这样您只需通过 if (parameter)if (NULL == parameter) 进行检查。

void Function(CArray<CClass*> *parameter = NULL);

【讨论】:

以上是关于如何使用空 CArray 初始化 CArray<CClass*> 函数参数的默认值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MFC 中创建“CArray<CArray<CString>>& results”?

CArray 和内存预分配

如何将 Pandas DataFrame 存储为 HDF5 PyTables 表(或 CArray、EArray 等)?

PyTables 之外的 CArray 和 EArray 兼容性

里面有 CArray 的 CMap

通过 P/Invoke 将 MFC CArray 编组为 C#