我无法理解这个问题..看起来我缺少一些简单的东西?
在
复制指针无效,因为它不会改变c(好吧,c.ptr的引用计数会减少1)。请注意,我只是为了简单起见使用了“int”,但对于不可复制的类型也应该适用。
为什么呢?我有一个表示值(任何类型的值)的类,用于编译器的一种排序。在实例化时,实际值及其存储方式都是未知的。唯一已知的是类型。因此,该类存储包含稍后确定值的占位符的shared_ptr(在作为指针或引用传递函数定义的参数进行编译时相当于:编译器仅知道类型,没有其他信息)。在运行时,应将占位符替换为实际值。
编辑一下,开始新的一天,想到了这个。我知道这很简单。
现在的另一个问题是:上述内容是否适用于任何符合标准的指针?
(1)
点上,我应该在MakePointToSameValue
里写什么?
- both b.ptr and c.ptr point to the same as a.ptr
- in other words,
a.ptr.get() == b.ptr.get() == c.ptr.get()
- the value originally pointed to by b.ptr and c.ptr gets deleted
?
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(好吧,c.ptr的引用计数会减少1)。请注意,我只是为了简单起见使用了“int”,但对于不可复制的类型也应该适用。
为什么呢?我有一个表示值(任何类型的值)的类,用于编译器的一种排序。在实例化时,实际值及其存储方式都是未知的。唯一已知的是类型。因此,该类存储包含稍后确定值的占位符的shared_ptr(在作为指针或引用传递函数定义的参数进行编译时相当于:编译器仅知道类型,没有其他信息)。在运行时,应将占位符替换为实际值。
编辑一下,开始新的一天,想到了这个。我知道这很简单。
void MakePointToSameValue( Test& other )
{
other.ptr.swap( ptr );
ptr.reset();
ptr = other.ptr;
}
现在的另一个问题是:上述内容是否适用于任何符合标准的指针?