Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите понять два фрагмента кода, Перегрузки операций (хитро) 
:(
    Опции темы
null56
Дата 29.5.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



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

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

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

Вопрос (!!!): Когда могут вызваться, а главное как перегруженные операторы "->" у класса 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



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

Заранее благодарен за помощь
PM MAIL   Вверх
Lazin
Дата 29.5.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(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ВОТ ТАК


Это сообщение отредактировал(а) Lazin - 29.5.2008, 12:11
PM MAIL Skype GTalk   Вверх
null56
Дата 29.5.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



На счет того, чтобы вызывать нельзя было 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

PM MAIL   Вверх
mes
Дата 29.5.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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

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



--------------------
PM MAIL WWW   Вверх
Lazin
Дата 29.5.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



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

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

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

неа
PM MAIL Skype GTalk   Вверх
mes
Дата 29.5.2008, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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








--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0691 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.