我想要一个指向对象A
的智能指针,该对象具有函数f
,该函数可以更改智能指针应指向的当前对象A
。该函数应适用于所有智能指针,其理想语法为:
//usage of f
std::unique_ptr<A> p(new A);
p.reset(p->f(p.get()));
原始指针用作参数和返回值,使其与任何智能指针一起工作。此实现中的缺陷是由于f
返回与其给定的指针相同的指针而导致的自分配。自分配将导致删除A
的当前实例,这不是我们想要的。为了解决这个问题,我们可以使用f
,如下所示:
//modified usage of f
std::unique_ptr<A> p(new A);
A* temp = p->f(p.get());
if(p.get() != temp) {
p.reset(temp);
}
这需要在智能指针旁边有一个临时的原始指针,该指针甚至可能指向同一对象。对我来说,这感觉像是糟糕的设计,我希望有比这更好的解决方案。
我也考虑过通过引用传递智能指针,但这有一些问题:
- 它不会在重置智能指针后强制返回,这可能会导致内存损坏
- 它强制函数采用特定的智能指针作为参数
我是不是想得太多了?使用临时原始指针来检查是否需要重置智能指针实际上很好吗?此外,为什么reset
函数尚未检查自分配?
澄清更新
首先,在示例中,f(p.get())
可以替换为f()
,因为不需要输入参数。函数将返回一个指向自身的指针,或者创建一个新对象并返回该指针。
感谢您到目前为止的帮助,这里有一个简短的澄清。类A
旨在用作一个状态,它有一个函数,当程序处于该状态时,该函数会被反复调用以处理需要执行的任何操作。这种处理还可能包括更改状态,这是通过将适当的指针返回到新状态来完成的。
我上传了一个示例和解释(仅使用原始指针),说明我希望如何使用这个类。欢迎对设计进行反馈。虽然我意识到这不是最初的问题,但它可能会引出我真正寻求的答案。
我想要一个指向对象a的智能指针,它有一个函数f,可以更改智能指针应该指向的当前对象a。
这是一个非常奇怪(也很尴尬)的面向对象类设计。你的对象有一个成员函数,它将修改拥有指向它的指针的对象。强烈建议重新设计你的类结构。
你应该这样设计:
- 您的类
A
没有f
作为成员函数 - 第二类
B
,包含并管理智能指针,并具有f
作为成员函数
或者:
f
是A
内部的一个静态函数,它引用了智能指针:
静态f(shared_ptr&shPtr);
您可以使用std::unique_ptr:的发布方法
更新:
class A {
public:
A* f( std::unique_ptr<A> pointer )
{
if( /* some condition */ ) {
return new A;
} else {
return pointer.release();
}
}
};
std::unique_ptr<A> p( new A );
p.reset( p->f( std::unique_ptr<A>( p.release() ) ) );