指向可以更改指针的对象的智能指针
Smart pointer to an object that can change the pointer
我想要一个指向对象 A
的智能指针,它具有一个函数 f
,可以更改智能指针应该指向的当前对象 A
。该函数应该适用于所有智能指针,其理想语法是这样的:
//usage of f
std::unique_ptr<A> p(new A);
p.reset(p->f(p.get()));
原始指针用作参数和 return 值以使其适用于任何智能指针。此实现中的缺陷是由于 f
return 使用相同的指针而导致的自赋值。自赋值会导致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);
}
这需要在甚至可能指向同一对象的智能指针旁边有一个临时的原始指针。对我来说,这感觉像是糟糕的设计,我希望有比这更好的解决方案。
我也考虑过通过引用传递智能指针,但这有一些问题:
- 它不会在重置智能指针后强制执行 return,这可能会导致内存损坏。
- 它强制函数将特定的智能指针作为参数。
我是不是想多了这个问题?使用临时原始指针来检查智能指针是否需要重置真的很好吗?
另外,为什么 reset
函数还没有检查自赋值?
澄清更新
首先,示例中的 f(p.get())
可以替换为 f()
,因为不需要输入参数。该函数将 return 指向自身的指针或创建一个新对象并 return 该指针。
感谢迄今为止的所有帮助,在此做一个简短的说明。
Class A
旨在用作一种状态,它具有一个函数,当程序处于该状态时,该函数会被重复调用以处理需要完成的任何事情。此处理还可能包括更改状态,这是通过 return 将适当的指针指向新状态来完成的。
我上传了一个 example and explanation(仅使用原始指针)说明我想如何使用这个 class。欢迎对设计提出反馈意见。虽然我意识到这不是最初的问题,但它可能会导致我真正寻求的答案。
可以使用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() ) ) );
I want to have a smart pointer to an object A that has a function f which can change the current object A that the smart pointer should point to.
这是一个非常奇怪(而且笨拙)的面向对象 class 设计。您的对象有一个成员函数,它将修改拥有指向它的指针的对象。强烈建议完全重新设计 class 结构。
你应该这样设计:
- 你的 class
A
没有 f
作为成员函数
- 第二个class
B
包含和管理智能指针,并且有f
作为成员函数
或者:
f
是 A
内部的静态函数,并引用智能指针:
静态 f(shared_ptr & shPtr);
我想要一个指向对象 A
的智能指针,它具有一个函数 f
,可以更改智能指针应该指向的当前对象 A
。该函数应该适用于所有智能指针,其理想语法是这样的:
//usage of f
std::unique_ptr<A> p(new A);
p.reset(p->f(p.get()));
原始指针用作参数和 return 值以使其适用于任何智能指针。此实现中的缺陷是由于 f
return 使用相同的指针而导致的自赋值。自赋值会导致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);
}
这需要在甚至可能指向同一对象的智能指针旁边有一个临时的原始指针。对我来说,这感觉像是糟糕的设计,我希望有比这更好的解决方案。
我也考虑过通过引用传递智能指针,但这有一些问题:
- 它不会在重置智能指针后强制执行 return,这可能会导致内存损坏。
- 它强制函数将特定的智能指针作为参数。
我是不是想多了这个问题?使用临时原始指针来检查智能指针是否需要重置真的很好吗?
另外,为什么 reset
函数还没有检查自赋值?
澄清更新
首先,示例中的 f(p.get())
可以替换为 f()
,因为不需要输入参数。该函数将 return 指向自身的指针或创建一个新对象并 return 该指针。
感谢迄今为止的所有帮助,在此做一个简短的说明。
Class A
旨在用作一种状态,它具有一个函数,当程序处于该状态时,该函数会被重复调用以处理需要完成的任何事情。此处理还可能包括更改状态,这是通过 return 将适当的指针指向新状态来完成的。
我上传了一个 example and explanation(仅使用原始指针)说明我想如何使用这个 class。欢迎对设计提出反馈意见。虽然我意识到这不是最初的问题,但它可能会导致我真正寻求的答案。
可以使用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() ) ) );
I want to have a smart pointer to an object A that has a function f which can change the current object A that the smart pointer should point to.
这是一个非常奇怪(而且笨拙)的面向对象 class 设计。您的对象有一个成员函数,它将修改拥有指向它的指针的对象。强烈建议完全重新设计 class 结构。
你应该这样设计:
- 你的 class
A
没有f
作为成员函数 - 第二个class
B
包含和管理智能指针,并且有f
作为成员函数
或者:
f
是A
内部的静态函数,并引用智能指针:
静态 f(shared_ptr & shPtr);