
Oleg Fedtchenko wrote:
To Peter Dimov
Hi, Peter
Could you, please, tell if is there a smart pointer template to a class data-member. I failed to find an appropriate pointer among five ones existing in the boost.
I need it for the two tasks appended.
No, none of the existing pointers address the problem directly, although shared_ptr can be persuaded to do what you want.
Task 2)
class DocActiveX { protected: Tree* m_pTree;
public: ~DocActiveX(){ if(m_pTree) delete m_pTree;} bool Load( const char* lpszPath); Tree* Parse(){ return m_pTree;} };
That's the easy part. class DocActiveX { private: shared_ptr<Tree> m_pTree; public: bool Load( const char* lpszPath ); shared_ptr<Tree> Parse() { return m_pTree; } };
Task 1)
class A { public: A(){ m_wData = 0;} WORD* GetData(){ return &m_wData} A* CreateA( int nOffset){ return new A;}
protected: WORD m_wData; };
This is a bit harder. class A { private: WORD m_wData; private: A(); public: static shared_ptr<A> CreateA() { return shared_ptr<A>(new A); } friend shared_ptr<WORD> GetData( shared_ptr<A> this_ ) { return shared_ptr<WORD>( &this_->m_wData, boost::bind( &shared_ptr<A>::reset, this_ ) ); } }; int main() { shared_ptr<A> pa = A::CreateA(); shared_ptr<WORD> pw = GetData(pa); pa.reset(); std::cout << "*pw: " << *pw << '\n'; }