前提条件: この質問を理解するには、最初に次の質問とその回答を読んでください 。auto_ptr<Base>をauto_ptr<Derived>にキャストします。
キャストで auto_ptr<Base>から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;
}
Ok。ここでは、「所有権の譲渡」がで行われていることがわかりますc2 = c3
。しかし、で一時的な作成を行うことはできませんstatic_cast
。
問題は、一時オブジェクトの作成の小さなシミュレーションをどのように作成するstatic_cast
かです。
スティーブは、キャスト中に一時的なオブジェクトが作成されると信じています。私が欲しいのは、一時的な作成を示す例を書くことだけです。このターゲットには学術的な理由があります。
誰かが、参照されたトピックに投稿したスティーブの回答に記載されている効果を達成する方法を明確にすることができますか?