我无法弄清楚.. 看起来我错过了一些简单的东西?我该放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)
复制 ptr 不起作用,因为它不会改变 c(嗯,c.ptr 的引用计数减少了 1)。请注意,我int
只是为了简单起见,但它应该适用于不可复制的类型。
为什么?我有一个表示值的类,任何类型的值,用于某种编译器。实际值及其存储方式在实例化时是已知的。唯一知道的是类型。因此,该类存储了一个 shared_ptr ,其中包含稍后确定的值的占位符(对应于编译作为指针或引用传递的函数定义的参数:编译器只知道类型,仅此而已)。在运行时,占位符应替换为实际值。
编辑新的一天,想出了这个。我知道这很简单。
void MakePointToSameValue( Test& other )
{
other.ptr.swap( ptr );
ptr.reset();
ptr = other.ptr;
}
现在的另一个问题是:对于任何符合标准的指针,上述工作是否会按预期工作?