【发布时间】:2011-12-20 20:08:42
【问题描述】:
先决条件: 要理解这个问题,请先阅读以下问题及其答案: Cast auto_ptr<Base> to auto_ptr<Derived>
在 Cast auto_ptr<Base> to auto_ptr<Derived> Steve 回答说 “您的 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... 在您的示例代码中根本没有使用。你能澄清一下吗? -
int wmain()不是标准的 c++ 主函数。 -
@wilhelmtell 我已经编辑了这个问题。如果您对它感兴趣,请重新阅读。
-
"应该调用运算符)。" 哪个运算符?
-
@curiousguy - 已更正!
标签: c++ casting static-cast temporary-objects