How can I initialize the default value of a CArray<CClass*> function parameter with an empty CArray?
Asked Answered
P

1

0

I know I could do this better with std::vector, but the application I am messing with, has already a bunch of CArray parameters on a lot of related functions ... and I will not change them all at the moment!

I simply want to define an empty CArray<CClass*> — array of pointers to CClass, so the problem can not be on the CClass constructor — as the default value of a function parameter.

Approach 1

If I try to do it with assignment operator and default constructor:

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

I get the error:

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>          ]

Approach 2

I also tried with a copy constructor:

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

I got the errors:

 >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
  • line X: contains a call supplying the parameter to Function, as shown: pFunctionClass->Function(parameter);

1>CFunctionClass.cpp(line Y): error C2511: 'void CFunctionClass::Function(CArray)' : overloaded member function not found in 'CShoePlaceDoc' 1> with 1> [ 1> TYPE=CClass* 1> ] 1> FunctionClass.h(line A) : see declaration of 'CFunctionClass'

  • line Y contains the Function implementation header, as shown: `void CFunctionClass::Function(CArray parameter)

1>File.cpp(line Z): error C2660: 'CClassFunction::Function' : function does not take 0 arguments

  • line Z: contains a call to Functionwithout supplying it parameters, as shown: pClassFunction->Function();

The approach didn't work, but it got its way towards a conclusion: It is not possible to use a copy-constructor for assigning a default value for a function parameter.

Approach 3

And if I try with a lambda:

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

, then I will get multiple outputs of these two errors:

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
  • line A: method declaration
  • line B: closing } of FunctionClass class that contains Function method

Origin of the problem

The root cause of the problem seems to be the fact that CArray is a class directly derived from CObject, which declares the assignment operator as private:

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

So, how can I supply an empty array as default value for the parameter?

Paley answered 19/8, 2015 at 15:58 Comment(1)
I am not sure if I follow. Even if you could solve the problem with copy constructor and assignment operator, why would you want it? It's better to access pointers directly. Something like this: void Function(CArray<CClass*> *p = NULL){if (p == NULL){p = Default;}...}Helluva
B
0

With this declaration

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

You can't. Calling this function will invoke the private copy constructor of CObject as you have noticed.

What you could do, is to add a object of static CArray<CClass*> in your class and initialize the function with a reference to it. This way it will be empty (as long as you do not populate it...) and you can perform a .IsEmpty() check on it.

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

Or initialize it to 0. This way you simply check it by if (parameter) or if (NULL == parameter).

void Function(CArray<CClass*> *parameter = NULL);
Bertabertasi answered 20/8, 2015 at 6:34 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.