Re: Чересчур умный указатель
От: Smal Россия  
Дата: 19.01.07 13:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В коде приведенном ниже программа почему-то падает в случае (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.
С уважением, Александр
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.