私はこれを理解することはできません..単純なものが欠けているように見えますか? MakePointToSameValue
ポイントで何を入れますか(1)
- b.ptr と c.ptr の両方が a.ptr と同じものを指している
- 言い換えると、
a.ptr.get() == b.ptr.get() == c.ptr.get()
- b.ptr と c.ptr が最初に指していた値が削除される
?
struct Test
{
public:
Test( int val ) :
ptr( std::make_shared< int >( val ) )
{
}
void MakePointToSameValue( Test& other )
{
//what do I put here?
//other.ptr = this->ptr; //doesn't do it
}
private:
std::shared_ptr< int > ptr;
};
Test a( 0 );
Test b( 5 );
Test c( b );
b.MakePointToSameValue( a );
//(1)
c を変更しないため、ptr のコピーは機能しません (まあ、c.ptr の参照カウントは 1 減ります)。簡単にするために使用することに注意してくださいint
。ただし、コピーできない型でも機能するはずです。
なんで?ある種のコンパイラで使用するための、あらゆるタイプの値を表すクラスがあります。実際の値も格納方法も、インスタンス化された時点でわかります。わかるのは型だけです。したがって、クラスは、後で決定される値のプレースホルダーを含む shared_ptr を格納します (ポインターまたは参照として渡されたときに関数定義の引数をコンパイルすることに相当します: コンパイラーは型のみを認識し、それ以上は認識しません)。実行時に、プレースホルダーを実際の値に置き換える必要があります。
一日の新たなスタートを編集して、これを思いつきました。私はそれが簡単であることを知っていました。
void MakePointToSameValue( Test& other )
{
other.ptr.swap( ptr );
ptr.reset();
ptr = other.ptr;
}
追加の質問は次のとおりです。上記は、標準に準拠したポインターに対して期待どおりに機能しますか?