Re: Template collection classes
marcomb wrote:
I have read in a book about CArray, CList and CMap.
The book says that for example Carray class everytime we add an object,
MAKES a copy of the object we need to store, so we need probably to implement
a copy constructor.
But it also says as it's true, that we quite always use Reference as
Argument Type, to evitate COPIES...passing by reference,so address and not by
value.
I'm quite confusing...the copies is made or not in our CArray object?
If the copy wasn't made we would have a CArray class object that would
contain addresses or pointers, equals to CTypedPtrArray....
so for example:
CArray<CPoint, CPoint&> PointArray;
CPoint aPoint = new CPoint(...paramlist...);
PointArray.Add(aPoint);
so we pass aPoint by reference, but still we create a copy of it in
PointArray or what else?Pointarray manage only address of aPoint?
and if my declarations was:
CArray<CPoint, CPoint> PointArray;
CPoint aPoint = new CPoint(...paramlist...);
PointArray.Add(aPoint);
and also...
CArray<CPoint, CPoint*> PointArray;
CPoint aPoint = new CPoint(...paramlist...);
PointArray.Add(aPoint);
what's the difference from
CTypePtrArray<CObList,CPoint*> PointArray;
CPoint aPoint = new CPoint(...paramlist...);
PointArray.Add(aPoint);
marcomb:
Part of the reason you are confused is that the double template argument
in the MFC collection classes is very confusing, and (IMHO) unnecessary.
The C++ stadard library classes like std::vector have no such double
argument, In fact, in recent versions of MFC the second argument is
defaulted
template<class TYPE, class ARG_TYPE = const TYPE&> class CArray:
public CObject
{
};
But all of your examples are actually wrong (and will not compile)
because you are mixing objects, references and pointers in invalid ways.
Two correct ways are
// array holds objects
CArray<CPoint, CPoint&> PointArray;
CPoint aPoint(...paramlist...);
PointArray.Add(aPoint);
// array holds pointers
CArray<CPoint*, CPoint*> PointArray;
CPoint* pPoint = new CPoint(...paramlist...);
PointArray.Add(pPoint);
HTH,
--
David Wilkinson
Visual C++ MVP