指向可以更改指针的对象的智能指针



我想要一个指向对象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作为成员函数

或者:

  • fA内部的一个静态函数,它引用了智能指针:

静态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() ) ) );

相关内容

  • 没有找到相关文章

最新更新