Чересчур умный указатель
От: Аноним  
Дата: 19.01.07 13:08
Оценка:
В коде приведенном ниже программа почему-то падает в случае (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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.