Re: CComPtr subtlety
Jason S <jmsachs@gmail.com> wrote:
There are two constructors and two assignment operators that sort of
do the same thing:
[in the CComPtr class in atlbase.h, this is the msvc 6 version]
CComPtr(T* lp)
{
if ((p = lp) != NULL)
p->AddRef();
}
CComPtr(const CComPtr<T>& lp)
{
if ((p = lp.p) != NULL)
p->AddRef();
}
why the 2nd one in each pair?
They take different arguments. One supports
IInterface* p;
CComPtr<IInterface> q = p;
the other supports
CComPtr<IInterface> p;
CComPtr<IInterface> q = p;
I tried creating a similar class without
the 2nd pair and it seems to not work (it compiles but the reference
count does not change for some reason)
The second constructor is a copy constructor. If you don't provide one,
compiler automatically generates a copy constructor that simply performs
member-wise copy. Similarly for copy assignment operator. If member-wise
copy is the wrong thing to do (as it is in this case), you have to
explicitly write copy constructor and copy assignment operator.
C++ Rule of Three: if your class requires a non-trivial destructor, it
also requires a non-trivial copy constructor and copy assignment
operator.
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925