Как я могу инициализировать значение по умолчанию параметра функции CArray <CClass *> с пустым CArray?

Я знаю, что мог бы сделать это лучше сstd::vector, но приложение, с которым я связываюсь, уже имеет кучуCArray параметров на множество связанных функций ... и я не буду менять их все в данный момент!

Я просто хочу определить пустойCArray<CClass*> - массивуказатели в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: содержит вызов, предоставляющий параметр функции, как показано:pFunctionClass->Function(parameter);

1> CFunctionClass.cpp (строка Y): ошибка C2511: «void CFunctionClass :: Function (CArray)»: перегруженная функция-член не найдена в «CShoePlaceDoc» 1> с 1> [1> TYPE = CClass * 1>] 1> FunctionClass.h (строка A): см. Объявление «CFunctionClass»

строка Y содержитFunction заголовок реализации, как показано: `void CFunctionClass :: Function (параметр CArray)

1> File.cpp (строка Z): ошибка C2660: «CClassFunction :: Function»: функция не принимает 0 аргументов

строка Z: содержит вызовFunctionбез указания параметров, как показано:pClassFunction->Function();

Подход не сработал, но он получил свой путь кзаключение: Невозможно использовать конструктор копирования для назначения значения по умолчанию для параметра функции.

Подход 3

И если я попробую слямбда:

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: закрытие} изFunctionClass класс, который содержитFunction метод

Происхождение проблемы

Основной причиной проблемы, как представляется, является тот факт, чтоCArray это класс, производный отCObject, который объявляет оператор присваивания как закрытый:

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

Итак, как я могу предоставить пустой массив в качестве значения по умолчанию для параметра?

 Barmak Shemirani19 авг. 2015 г., 18:50
Я не уверен, если я последую. Даже если бы вы могли решить проблему с помощью конструктора копирования и оператора присваивания, зачем вам это нужно? Лучше получить прямой доступ к указателям. Что-то вроде этого:void Function(CArray<CClass*> *p = NULL){if (p == NULL){p = Default;}...}

Ответы на вопрос(1)

С этой декларацией

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

Ты не можешь Вызов этой функции вызовет конструктор частной копииCObject как вы заметили.

Что вы могли бы сделать, это добавить объектstatic CArray<CClass*> в вашем классе и инициализировать функцию со ссылкой на него. Так будет пусто(до тех пор, пока вы его не заселите ...) и вы можете выполнить.IsEmpty() Проверь это.

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

Или инициализируйте его до 0. Таким образом, вы просто проверяете егоif (parameter) или жеif (NULL == parameter).

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

Ваш ответ на вопрос