C++ 如何返回唯一的引用\u ptr<;派生>;来自unique_ptr<;基础>;?
我在派生结构上使用unique_ptr,并返回引用以维护所有权并保持最小的开销 基本上,我需要一个get函数将C++ 如何返回唯一的引用\u ptr<;派生>;来自unique_ptr<;基础>;?,c++,c++11,inheritance,unique-ptr,c++20,C++,C++11,Inheritance,Unique Ptr,C++20,我在派生结构上使用unique_ptr,并返回引用以维护所有权并保持最小的开销 基本上,我需要一个get函数将unique\u ptr转换为unique\u ptr& 我无法使用动态\u指针\u强制转换,因为它复制并失败: 调用“动态指针强制转换(std::unique\u ptr&)”时没有匹配函数。 我不能使用std::move或release fromobj,因为它是程序真实性的来源 你们有别的选择吗? 共享的ptr版本工作正常顺便说一句,它是唯一的路径吗 提前感谢您的投入。 法学博士
unique\u ptr
转换为unique\u ptr&
- 我无法使用动态\u指针\u强制转换,因为它复制并失败:
调用“动态指针强制转换(std::unique\u ptr&)”时没有匹配函数。
- 我不能使用std::move或release from
,因为它是程序真实性的来源obj
#包括
结构基{
};
结构派生:公共基{
浮动位置;
派生(浮点位置){
};
//真理之源
std::唯一对象;
//从obj检索
模板
std::unique_ptr&get(){
标准::唯一性\u ptr&p=obj;
return std::dynamic_pointer_cast(p);//您仍然可以使用原始指针执行常规的dynamic_cast
,即:
template<typename T>
T* get() {
std::unique_ptr<Base> &p = obj;
return dynamic_cast<T*>(p.get());
}
模板
T*get(){
标准::唯一性\u ptr&p=obj;
返回动态_cast(p.get());
}
语义上,这是可以的,因为原始指针被认为是非拥有的。您仍然可以对原始指针执行常规的动态\u cast
,即:
template<typename T>
T* get() {
std::unique_ptr<Base> &p = obj;
return dynamic_cast<T*>(p.get());
}
模板
T*get(){
标准::唯一性\u ptr&p=obj;
返回动态_cast(p.get());
}
从语义上来说,这是ok的,因为原始指针被认为是非所有权的。get
应该返回一个非所有权指针,因为它不应该更改所有权
template<typename T>
T * get() {
return std::dynamic_cast<T *>(obj.get());
}
模板
T*get(){
返回std::dynamic_cast(obj.get());
}
get
应该返回一个非所有权指针,因为它不应该更改所有权
template<typename T>
T * get() {
return std::dynamic_cast<T *>(obj.get());
}
模板
T*get(){
返回std::dynamic_cast(obj.get());
}
简短回答:不要!
长答案:唯一指针处理所有权,引用没有所有权语义。您可以返回(const)引用。如果需要共享所有权,请使用std::shared_指针。短答案:不要!
详细回答:唯一指针处理所有权,引用没有所有权语义。您可以返回(const)引用。如果您需要共享所有权,请使用std::shared_pointer。您可以返回一个指针或对保存在unique_ptr中的对象的引用。传递非所有权指针非常好,只要您从不手动删除
任何内容您可以返回一个指针或对保存在unique_ptr中的对象的引用相反,他是独一无二的。只要你从不手动delete
任何东西,就可以传递非所有权指针。我不会假设obj
指向任何东西,更不用说t
了,谢谢你的主意。我必须在Base中添加一个虚拟函数,否则它会拒绝动态转换(非多态性上无强制转换)。似乎现在就可以完成任务了。将测试并接受。@JBDumont您的Base
类应该有一个虚拟析构函数,它将足以满足动态强制转换
,同时还确保当unique\u ptr
删除Base*
指针时,它将正确调用派生的
析构函数。我不认为tobj
is指向任何东西,更不用说at
了,谢谢你的主意。我不得不在Base中添加一个虚拟函数,否则它会拒绝动态转换(非多态性上不转换)。似乎现在就可以做了。将测试并接受。@JBDumont您的Base
类应该有一个虚拟析构函数,它将足以满足动态
,同时还确保当unique\u ptr
删除Base*
指针时,它将正确调用派生的
析构函数。我明白您的意思了。I just想在当地借钱,但如果业主去世,我们是SF。在我的情况下,业主的寿命会更长(我没有提到)所以应该没问题。对于短期业主,我会坚持你提醒我的共享产权。我明白你的意思。我只是想在当地借钱,但如果业主去世,我们是SF。在我的情况下,业主的寿命会更长(我没有提到),所以应该没问题。对于短期业主,我会坚持你提醒我的共享产权。