Re: Design question related to std::auto_ptr
* Vladimir Jovic:
abhay.burli@gmail.com wrote:
Hello Group,
Consider the following class design using forward declarations.
//start-snip
#include<memory>
class Details;
class MyConcrete {
private:
std::auto_ptr<Details> details_;
};
int main() {
MyConcrete obj;
return 0;
}
// end-snip
[snip]
This is the output from g++ 4.1.2:
g++ fr.cpp
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/backward/auto_ptr.h:
In destructor ?std::auto_ptr<_Tp>::~auto_ptr() [with _Tp = Details]?:
fr.cpp:6: instantiated from here
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/backward/auto_ptr.h:173:
note: neither the destructor nor the class-specific operator delete will
be called, even if they are declared when the class is defined.
I would take it serious, and include the header of the class Details in
the cpp file.
Q-2. Do boost smart-pointers also have the same semantics w.r.t to the
above situation?
Off course
Happily that's incorrect. :-)
std::auto_ptr's referent type is required to be complete, but that is not a
requirement of e.g. boost::shared_ptr.
And in particular, boost::shared_ptr provides custom deleter functionality that
probably can handle the OP's case with ease (weasel-words present because the
example is lacking in detail).
Q-3. Any suggestions on redesign? Something like using PIMPL, and
implement the above concrete class in a .cpp file where i can #include
the composed class definition though;it is quite a lot of redesign!
In the header forward declare, but include the headers (or forward
declared classes) in the source files
Generally good advice.
Sometimes the "problem" of incomplete type is only present due to premature
optimization of build times.
Cheers & hth.,
- Alf
--
Due to hosting requirements I need visits to <url: http://alfps.izfree.com/>.
No ads, and there is some C++ stuff! :-) Just going there is good. Linking
to it is even better! Thanks in advance!