Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Помогите понять два фрагмента кода


Автор: null56 29.5.2008, 11:55
Темой ранее задавал вопрос по поводу перегрузки двух операций, но для вопроса здесь, мне придется привезти фрагмент файлика, он небольшой, но хитрый....

Сразу скажу, программа работает, но писал не я... )

Назначение программы: Уничтожать динамические объекты, будь то, массивы или одиночные объекты

Вопрос (!!!): Когда могут вызваться, а главное как перегруженные операторы "->" у класса TPointer и закрытый деструктор базового класса... я не допер, но может туплю... В коде выделю эти моменты

!!! Сразу скажу, что скомпилить мне удалось только на вижуал студио под виндой, под gcc не получилось

Код

#if !defined(__POINTER_H)

#define __POINTER_H



//

// class TPointerBase

// ~~~~~ ~~~~~~~~~~~~

template<class T> 

class TPointerBase {

  public:

    T&   operator  * () 

    {

        return *P;

    }



    operator T* () 

    {

        return P;

    }



    int  operator  ! () const 

    {

        return P==0;

    }



    T*   Relinquish() 

    {

        T* p = P; 

        P = 0; 

        return p;

    }



  protected:

    TPointerBase(T* pointer) : P(pointer) 

    {}



    TPointerBase() : P(0) 

    {}



    T* P;



  private:

    void* operator new (size_t) 

        {

            return 0;

        }  // prohibit use of new

    void operator delete(void* p) 

    {

        ((TPointerBase<T>*)p)->P=0; ///!!!!!!!!!!!!!!!!!!!!!!!! КАК ВЫЗВАТЬ ЭТО? раз

    }

};



//

// class TPointer

// ~~~~~ ~~~~~~~~

// Pointer to a single object. Provides member access operator ->

//

template<class T> 

class TPointer : public TPointerBase<T> {

  public:

    TPointer() : TPointerBase<T>() 

    {}



    TPointer(T* pointer) : TPointerBase<T>(pointer) 

    {}



   ~TPointer() 

   {

       delete P;

   }



    TPointer<T>& operator = (T* src) 

    {

        delete P; 

        P = src; 

        return *this;

    }



    T* operator ->() 

    {

        return P;  ////// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  КАК ВЫЗВАТЬ ЭТО !!! два

    }  // Could throw exception if P==0

};



//

// class TAPointer

// ~~~~~ ~~~~~~~~~

// Pointer to an array of type T. Provides an array subscript operator and uses

// array delete[]

//

template<class T> class TAPointer : public TPointerBase<T> {

  public:

    TAPointer() : TPointerBase<T>() 

    {}



    TAPointer(T array[]) : TPointerBase<T>(array) 

    {}



   ~TAPointer() 

   {

       delete[] P;

   }



    TAPointer<T>& operator =(T src[]) 

    {

        delete[] P; 

        P = src; 

        return *this;

    }



    T& operator[](int i) 

    {

        return P[i];

    }  // Could throw exception if P==0

};





#endif  // __POINTER_H



Мне просто интересно, зачем автор определял их содержимое, если невозможно их вызвать, хотя я могу ошибаться, скорее так и есть....
Если кто понял эти фрагменты кода, отпишитесь пожалуйста.

Заранее благодарен за помощь

Автор: Lazin 29.5.2008, 12:10
Цитата(null56 @  29.5.2008,  11:55 Найти цитируемый пост)
//!!!!!!!!!!!!!!!!!!!!!!!! КАК ВЫЗВАТЬ ЭТО? раз

никак, оно ведь private, а друзей у класса нет (это сделано для того, что-бы пользователь класса размещал объекты класса TPointer и TAPointer в стеке)


Цитата(null56 @  29.5.2008,  11:55 Найти цитируемый пост)
///// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  КАК ВЫЗВАТЬ ЭТО !!! два


Код

class Foo
{
 void bar() {}
};

TPointer<Foo> p(new Foo);

p->bar();///!!!!!!!!!!!!!!!111ВОТ ТАК

Автор: null56 29.5.2008, 12:18
На счет того, чтобы вызывать нельзя было new и delete  это видно, он даже сам написал...

но зачем вот это???
Код

 ((TPointerBase<T>*)p)->P=0; ///!!!!!!!!!!!!!!!!!!!!!!!! КАК ВЫЗВАТЬ ЭТО? раз


если это не вызовится, зачем что - то внутри писать... я вот думаю


и второе

Код

class Foo
{
 void bar() {}
};

TPointer<Foo> p(new Foo);

p->bar();///!!!!!!!!!!!!!!!111ВОТ ТАК


как вот так?
если оператор вернет указатель на объект

Код

T* operator ->() 
    {
        return P;  ////// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  КАК ВЫЗВАТЬ ЭТО !!! два
    }  // Could throw exception if P==0

Автор: mes 29.5.2008, 12:35
Цитата(null56 @  29.5.2008,  12:18 Найти цитируемый пост)
T* operator ->() 
    {
        return P;  //////

так это тоже приват ))

используй не приватные функции , 
если базовый класс редактировать нельзя то делать так :
T* operator ->() 
    {
               return operator T*(); 
    };

Автор: Lazin 29.5.2008, 12:42
Цитата(null56 @  29.5.2008,  12:18 Найти цитируемый пост)
если оператор вернет указатель на объект

то рекурсивно вызовется оператор -> для этого указателя, это называется smart pointer
смотри стандарт - раздел 13.5.6

Добавлено через 2 минуты и 21 секунду
Цитата(mes @  29.5.2008,  12:35 Найти цитируемый пост)
так это тоже приват ))

неа

Автор: mes 29.5.2008, 13:00
Цитата(Lazin @  29.5.2008,  12:42 Найти цитируемый пост)
так это тоже приват ))
неа 

имелось ввиду что P в привате, а не оператор -> ))






Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)