
The boost::scopted_ptr is the best way to implement this. No need for shared_ptr because pimpl is usually not shared (until you implement some kind of lazy copy-on-write, where shared_ptr _is_ very useful). It can be also implemented with std::auto_ptr but it more dangerous, because it will pass the compilation if you forget to implement copy constructor and operator=(). In that case, the results will be disastrous - I guess anyone remembers what auto_ptr's copy operator does... And another pitfal with both auto_ptr and shared_ptr (at least on VC7.1 compiler) is if you don't provide expicit destructor, the generated destructor will try destroy the auto_ptr, which in its turn will try to destroy you pimpl via imcomplete pointer, therefor not calling destructor. Fortunately compiler at least gives a warning: "deletion of pointer to incomplete type 'TestClass::PrivateData'; no destructor called" Just a small sniplet of working pimpl implementation with shared_ptr: header file: --- class TestClass { public: TestClass(); virtual ~TestClass(void); TestClass(const TestClass& other); TestClass& operator=(const TestClass& other); private: class PrivateData; boost::scoped_ptr<PrivateData> pd; }; implementation file: --- class TestClass::PrivateData { //.... }; TestClass::TestClass() :pd(new PrivateData) { } TestClass::TestClass(const TestClass& other) :pd(new PrivateData(*other.pd)) { } TestClass& TestClass::operator=(const TestClass& other) { pd.reset(new PrivateData(*other.pd)); return *this; } On 4/27/05, David Gruener <gruenedd@idmt.fraunhofer.de> wrote:
Hi, i'm wondering if there is a nice smart pointer in boost to implement PImpl. I found an implementation here: [1]. So, does boost provide a smart pointer which does play nice with pimpl, so that one doesn't need to provide a destructor, copyconstructor and assignment operator for the default cases?
--David
[1] http://www.octopull.demon.co.uk/arglib/TheGrin.html. _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
-- Best regards, Zigmar