Предпосылки: Чтобы понять этот вопрос, сначала прочитайте следующий вопрос и ответ на него: Привести auto_ptr‹Base› к auto_ptr‹Derived›
В Приведение auto_ptr‹Base› к auto_ptr‹Derived› Стив ответил, что "Ваш static_cast скопирует auto_ptr во временный файл, поэтому aS будет сброшен, а ресурс будет уничтожен, когда временный будет (в конце оператора)".
Меня интересует процесс временного создания при вызове static_cast
. Я хотел бы иметь код, который я могу отследить, чтобы увидеть этот эффект. Я не могу использовать static_cast<auto_ptr<Circle>> ...
, потому что он не может быть скомпилирован, поэтому мне нужно написать какой-то класс моделирования вместо auto_ptr
и наблюдать за процессом временного создания.
Я также понимаю, что временное создание тесно связано с вызовом конструктора копирования. Потеря права собственности auto_ptr
моделируется с помощью назначения копии, которое устанавливает для поля _radius
источника отрицательное значение (мне нужна простая логическая модель auto_ptr
).
Итак, я предлагаю следующий класс Circle
:
#include <iostream>
class Shape {};
class Circle: public Shape {
double _radius;
public:
explicit Circle(double radius = .5): _radius(radius) {}
Circle &operator =(Circle &circle) {
_radius = circle._radius;
circle._radius = -1.;
return *this;
}
Circle(Circle &circle) { *this = circle; }
double GetRadius() { return _radius; }
};
int wmain() {
using namespace std;
Circle c1(100), c2(200), c3(300);
c2 = c3;
Shape *s1, s2;
s1 = &c1;
wcout << static_cast<Circle *>(s1)->GetRadius() << endl;
return 0;
}
В порядке. Здесь мы видим, что «передача права собственности» происходит в c2 = c3
. НО не могу добиться временного создания в static_cast
.
Вопрос: как сделать небольшую симуляцию создания временного объекта во время static_cast
?
Я считаю, Стив, что временный объект создается во время кастинга. Единственное, что я хочу, это написать пример, показывающий временное создание. Эта цель имеет академические причины.
Может ли кто-нибудь прояснить, как добиться эффекта, описанного в ответе Стива, который он опубликовал в упомянутой теме?
auto_ptr
..., который вообще не используется в вашем примере кода. Не могли бы вы уточнить? - person Cameron   schedule 21.12.2011int wmain()
не является стандартной основной функцией С++. - person BЈовић   schedule 21.12.2011s1 = static_cast<Shape *>(&c2)
почему бы не простоs1 = &c2;
? - person curiousguy   schedule 21.12.2011operator=
вызывается неявно? - person curiousguy   schedule 21.12.2011