Я застрял с изучением Страуструппа на этом фрагменте. Язык С++, 4-е издание(фрагмент набит из
3-го издания, т.к. в нем нет опечатки), 14-я глава. Шаблон из Библиотеки С++.
Я в шаблоны с трудом въезжаю. Понятно его назначение, по контексту где он взят, и по примерам
его использования, - реализация деструктивного копирования. Но не пойму роль структуры/класса
auto_ptr_ref. С операторами преобразования(приведения) то-же какая-то несвязуха в голове.
Есть ли кто среди вас, кто бы популярно "расписал" как это шаблон действует.
Я отметил символом ?, строки с членами, назначение которых меня особенно "напрягают".
Благодарю за помощъ. Я здесь немного подправлю, доведу до ума, если получится со временем
все подробно распишу, по частям. Буду признателен если кто зделает какие-либо замечания.
template <class X> class std::auto_ptr {
? template <class Y> struct auto_ptr_ref { /* ... */ }; // helper class
X* ptr;
public:
typedef X element_type;
explicit auto_ptr(X* p=0) throw() { ptr=0; }
auto_ptr(auto_ptr& a) throw{} { ptr=a.ptr; a.ptr=0; } // note: not const auto_ptr&
? template <class Y> auto_ptr (auto_ptr <Y>& a) throw() { ptr=a.ptr; a.ptr=0; }
auto_ptr& operator=(auto_ptr& a) throw() { ptr=a.ptr; a.ptr=0; }
/-/-/ template<class Y> auto_ptr& operator=(auto_ptr<Y>& a) throw() { ptr=a.ptr; a.ptr=0; }
~auto_ptr() throw() { delete ptr; }
X& operator*() const throw() { return *ptr; }
X* operator->() const throw() { return ptr; }
X* get() const throw() { return ptr; } // extract pointer
X* release() throw() { X* t = ptr; ptr=0; return 1; } // relinquish ownership
void reset(X* p = 0) throw() { if(p != ptr) { delete ptr; ptr=p; }}
? auto_ptr(auto_ptr_ref<X>) throw(); // copy from auto_ptr_ref
? template<class Y> operator auto_ptr_ref<Y> () throw(); // copy from auto_ptr_ref
? template<class Y> operator auto_ptr<Y> () throw(); // destructive copy from auto_ptr
};
-------------------------------------------------------------------------------------------------
class BASE {};
class DERIVED : public BASE {};
void function()
{
auto_ptr<DERIVED> apD;
/*
параметризация X по DERIVED, разрешение перегрузки конструкторов:
explicit auto_ptr(X/*DERIVED*/* p=0) throw() { ptr=0; }
? # 1. Конструкторы копий учавствуют в данном разрешении?
? # 2. По логике получается что ниже конструктор копий, но он с неконстантной ссылкой, как его
трактует компилятор в данном разрешении, как конструктор копий?
auto_ptr(auto_ptr& a) throw() { ptr=a; a.ptr=0; }
? # 3. Аргумента нет, и шаблон ниже в разрешении не учавтвует?
template<class Y> auto_ptr (auto_ptr<Y>& a) throw { ptr=a.ptr; a.ptr=0; }
auto_ptr(auto_ptr_ref<X/*DERIVED*/>) throw ();
Вызавается explicit auto_ptr(DERIVED* p=0)
*/
auto_ptr<BASE> apB(apD);
/*
Параметризация X по BASE, разрешение перегрузки конструкторов:
? # 4. Здесь в разрешении, учавствуют все конструкторы или только конструкторы копий?
explicit auto_ptr(X /*BASE*/ p=0) throw() { ptr=0; }
auto_ptr(auto_ptr& a) throw() { ptr=a; a.ptr=0; }
по инициализатору выводится аргумент параметра, члена шаблона Y, - DERIVED
template<class Y> auto_ptr(auto_ptr<Y /*DERIVED*/>& a) throw() { ptr=a.ptr: a.ptr=0; }
? # 5. Я так понимаю здесь возможно приведение?
auto_ptr(auto_ptr_ref<X/*BASE*/>) throw();
*/
auto_ptr<BASE> apB1;
auto_ptr<DERIVED> apD1( apB1 ); // Ошибка
/*
*
*
*
*/
}
SpaceMarine
Пости пожалуйста подобные сообщения ТОЛЬКО в форум.
в Visuаl Studio отличий auto_ptr_ref от auto_ptr& нет.
Я задавал тотже вопрос: http://www.gamedev.ru/code/forum/?id=33222
Еще можно посмотреть здесь: http://beliaevs.livejournal.com/25009.html?mode=reply
PP
Спасибо! Я пока пропаду на этих ссылках, еще раз спасибо.
Тема в архиве.