Re[3]: приведение типа auto_ptr
От: centurn Россия  
Дата: 06.08.03 12:34
Оценка: 1 (1)
B>>А зачем?
А>это трудно объяснить...
А>будем считать что это академический интерес — такое приведение в принципе возможно?
А>при этом надо иметь ввиду что оба auto_ptr-а должны быть валидными и указывать
А>на один и тот же объект (в auto_ptr-е есть счетчик ссылок)...

Если в нем есть счетчик ссылок, это _принципиально_ уже _не_ auto_ptr, а просто некий "умный" указатель. Как сдеать такой указатель — уже другой вопрос.

А для auto_ptr в твоем случае преобразование простое:

std::auto_ptr<b> ptr_b( static_cast<b*>(ptr_a.release()));

Ясное дело, с передачей владения и со всеми последствиями каста — если точно значешь, что prt_a точно указыват на объект типаb .
Re[3]: приведение типа auto_ptr
От: centurn Россия  
Дата: 06.08.03 12:39
Оценка: 1 (1)
А>похоже на то... в vc6 его нет...


Да есть он, только он не преобразует указатели, которые не могут быть преобразованы _неявно_. И это хорошо, иначе была бы конкретная подстава!
приведение типа auto_ptr
От: Аноним  
Дата: 06.08.03 11:59
Оценка:
Привет!

подкажите пожалуйста как корректно произвести подобную манипуляцию (помечено ???????)

class a
{
public:
a() {};
virtual ~a() {};
};

class b : public a
{
public:
b() {};
virtual ~b() {};
};

void fn ()
{
auto_ptrt<a> ptr_a (new b());
auto_ptrt<b> ptr_b = ptr_a; // ????????????
}
Re: приведение типа auto_ptr
От: Аноним  
Дата: 06.08.03 12:07
Оценка:
Может так

А>void fn ()
А>{
А>  auto_ptrt<a> ptr_a (new b());
  auto_ptrt<b> ptr_b = ptr_a.get(); // ????????????
  ptr_a.release();
А>}
Re: приведение типа auto_ptr
От: Bell Россия  
Дата: 06.08.03 12:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А зачем?
Любите книгу — источник знаний (с) М.Горький
Re[2]: приведение типа auto_ptr
От: Аноним  
Дата: 06.08.03 12:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Может так


А>
А>>void fn ()
А>>{
А>>  auto_ptrt<a> ptr_a (new b());
А>  auto_ptrt<b> ptr_b = ptr_a.get(); // ????????????
А>  ptr_a.release();
А>>}
А>


а если в auto_ptr реализован подсчет ссылок и надо иметь оба указателя валидными?
Re: приведение типа auto_ptr
От: Федько Олег Россия  
Дата: 06.08.03 12:15
Оценка:
Видимо с помощью следующего оператора:

[msdn]
auto_ptr::operator auto_ptr<Other>
Casts from one kind of auto_ptr to another kind of auto_ptr.
template<class Other>
operator auto_ptr<Other>( ) throw( );
Return Value
The type cast operator returns auto_ptr <Other>(*this).
Example

// auto_ptr_op_auto_ptr.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>

using namespace std;
int main()
{
   auto_ptr<int> pi ( new int( 5 ) );
   auto_ptr<const int> pc = ( auto_ptr<const int> )pi;
}

[/msdn]
Re[2]: приведение типа auto_ptr
От: Аноним  
Дата: 06.08.03 12:18
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


B>А зачем?


это трудно объяснить...
будем считать что это академический интерес — такое приведение в принципе возможно?
при этом надо иметь ввиду что оба auto_ptr-а должны быть валидными и указывать
на один и тот же объект (в auto_ptr-е есть счетчик ссылок)...
Re[2]: приведение типа auto_ptr
От: Аноним  
Дата: 06.08.03 12:31
Оценка:
Здравствуйте, Федько Олег, Вы писали:

ФО>Видимо с помощью следующего оператора:


ФО>[msdn]

ФО>auto_ptr::operator auto_ptr<Other>
ФО>Casts from one kind of auto_ptr to another kind of auto_ptr.
ФО>template<class Other>
ФО> operator auto_ptr<Other>( ) throw( );
ФО>Return Value
ФО>The type cast operator returns auto_ptr <Other>(*this).
ФО>Example

ФО>
ФО>// auto_ptr_op_auto_ptr.cpp
ФО>// compile with: /EHsc
ФО>#include <memory>
ФО>#include <iostream>
ФО>#include <vector>

ФО>using namespace std;
ФО>int main()
ФО>{
ФО>   auto_ptr<int> pi ( new int( 5 ) );
ФО>   auto_ptr<const int> pc = ( auto_ptr<const int> )pi;
ФО>}
ФО>

ФО>[/msdn]

похоже на то... в vc6 его нет...

спасибо.
Re[2]: приведение типа auto_ptr
От: Аноним  
Дата: 08.08.03 06:14
Оценка:
Здравствуйте, Федько Олег, Вы писали:

ФО>Видимо с помощью следующего оператора:


ФО>[msdn]

ФО>auto_ptr::operator auto_ptr<Other>
ФО>Casts from one kind of auto_ptr to another kind of auto_ptr.
ФО>template<class Other>
ФО> operator auto_ptr<Other>( ) throw( );
ФО>Return Value
ФО>The type cast operator returns auto_ptr <Other>(*this).
ФО>Example

ФО>[ccode]

ФО>// auto_ptr_op_auto_ptr.cpp
ФО>// compile with: /EHsc
ФО>#include <memory>
ФО>#include <iostream>
ФО>#include <vector>

кстати а почему это способ не позволяет приводить указатель на родителя к указателю на наследника?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.