Здравствуйте, Аноним, Вы писали:
А>В коде приведенном ниже программа почему-то падает в случае (2).
А>Просто фантастика, не могу понять почему... Уже день за отладчиком провел...
А>Помогите, пожалуйста...
А>
А>// TestErr.cpp : Defines the entry point for the console application.
А>//
А>#include <iostream>
А>#include <string>
А>#include <cassert>
А>using namespace std;
А>namespace Gr
А>{
А>struct Error
А>{
А> virtual const char * type() = 0;
А> virtual const char * what() = 0;
А>};
А>class RuntimeError
А> : public Error
А>{
А>public:
А> RuntimeError( const string& sErr )
А> : mErr( sErr )
А> {}
А>private:
А> const char * type()
А> { return "RUNTIME ERROR"; }
А> const char * what()
А> { return mErr.c_str(); }
А> string mErr;
А>};
А>template<typename T>
А>class weak_ptr
А>{
А>public:
А> weak_ptr( T * p = 0 )
А> : mp( p )
А> {}
А> template<typename U>
А> weak_ptr( const weak_ptr<U>& wp )
А> {
А> mp = wp.mp;
А> wp.reset();
А> }
А> template<typename U>
А> weak_ptr( U * p )
А> : mp( p )
А> {
А> }
А> ~weak_ptr()
А> { reset(); }
А> void reset( T * p = 0 )
А> {
А> if( mp != 0 )
А> delete mp;
А> mp = p;
А> }
А> operator bool () const
А> {
А> return mp != 0;
А> }
А> T * operator -> () const
А> {
А> assert( mp != 0 );
А> return mp;
А> }
А>private:
А> T * mp;
А>}; // class weak_ptr
А>class ErrStorage
А>{
А>public:
А> ErrStorage( Error * p = 0 )
А> : mp( p )
А> {}
А> Error * operator -> () const
А> { return mp; }
А> operator bool () const
А> { return mp != 0; }
А>private:
А> Error * mp;
А>};
А>//typedef ErrStorage ErrorPtr; // (1)
А>typedef weak_ptr<Error> ErrorPtr; // (2)
А>//typedef Error * ErrorPtr; // (3)
А>ErrorPtr someOperation( int arg1, int arg2 )
А>{
А> if( arg1 > arg2 )
А> return new RuntimeError("error in arguments");
А> return 0;
А>}
А>}
А>int main(int argc, char * argv[])
А>{
А> cout << "IN MAIN" << endl;
А> Gr::ErrorPtr e;
А> if( e = Gr::someOperation(15, 10) )
А> {
А> cout << " (" << e->type() << "): " << e->what() << endl;
А> }
А> getchar();
А> return 0;
А>}
А>
А оператор = кто будет переопределять?
К тому же, этот код компилиться не будет. Метод reset не константный.
template<typename U>
weak_ptr( const weak_ptr<U>& wp )
{
mp = wp.mp;
wp.reset();
}
Используй std::auto_ptr.