我有一些当前使用原始指针的代码,我想更改为智能指针。这有助于以各种方式清理代码。无论如何,我有返回对象的工厂方法以及调用者管理它们的责任。所有权不共享,所以我unique_ptr
认为是合适的。我返回的对象通常都派生自一个基类,Object
.
例如,
class Object { ... };
class Number : public Object { ... };
class String : public Object { ... };
std::unique_ptr<Number> State::NewNumber(double value)
{
return std::unique_ptr<Number>(new Number(this, value));
}
std::unique_ptr<String> State::NewString(const char* value)
{
return std::unique_ptr<String>(new String(this, value));
}
返回的对象经常需要传递给另一个函数,该函数对类型对象Object
(基类)进行操作。没有任何智能指针,代码是这样的。
void Push(const Object* object) { ... } // push simply pushes the value contained by object onto a stack, which makes a copy of the value
Number* number = NewNumber(5);
Push(number);
在将此代码转换为使用时unique_ptrs
,我遇到了多态性问题。最初我决定简单地更改Push
to use的定义unique_ptrs
,但这会在尝试使用派生类型时产生编译错误。我可以将对象分配为基本类型,例如
std::unique_ptr<Object> number = NewNumber(5);
并将它们传递给Push
- 这当然有效。但是我经常需要在派生类型上调用方法。最后我决定对Push
指向存储的对象的指针进行操作unique_ptr
。
void Push(const Object* object) { ... }
std::unique_ptr<Object> number = NewNumber(5);
Push(number.get());
现在,发帖的原因。我想知道这是否是解决我遇到的问题的正常方法?对对象本身Push
进行操作会更好吗?unique_ptr
如果是这样,如何解决多态性问题?我会假设简单地投射 ptrs 是行不通的。需要从智能指针获取底层指针是否很常见?
谢谢,对不起,如果问题不清楚(请告诉我)。
编辑:我认为我的推送功能有点模棱两可。它复制底层值,实际上并不修改或存储输入对象。