Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 旋转共享\u ptr<;T>;参考_C++_Smart Pointers - Fatal编程技术网

C++ 旋转共享\u ptr<;T>;参考

C++ 旋转共享\u ptr<;T>;参考,c++,smart-pointers,C++,Smart Pointers,存储共享\u ptr时返回T&引用的最佳做法是什么? 示例场景: 我存储std::shared\u ptr lastLocation 并具有签名:Point&getlastPosition() 我想做一些像: Point& MyClass::getLastLocation(){ return *lastLocation.get() } 您的代码应该按原样工作。对get()的调用是多余的:共享指针本身可以像使用解引用操作符一样被解引用,从而产生所需的引用。所以只要简单地写就足够

存储
共享\u ptr
时返回
T&
引用的最佳做法是什么?
示例场景: 我存储
std::shared\u ptr lastLocation
并具有签名:
Point&getlastPosition()
我想做一些像:

Point& MyClass::getLastLocation(){
    return *lastLocation.get()
}

您的代码应该按原样工作。对
get()
的调用是多余的:共享指针本身可以像使用解引用操作符一样被解引用,从而产生所需的引用。所以只要简单地写就足够了

Point& MyClass::getLastLocation(){
    return *lastLocation;
}

请记住,
,除非其名称不能描述它是什么,否则首先可能不需要存储在动态内存中。检查你的代码设计并考虑是否首先需要任何类型的指针。

你能详细说明,可能有一些代码,你想做什么?code>*pointer\u name
为您提供指针指向的对象的引用。存储指针时,为什么要返回引用?如果指针没有有效的
点(例如:是空指针),您会返回什么?我举了一个例子@NathanOliver@UnholySheep我必须为学校执行任务,如果我不使用原始分配,我将获得奖金,因此我希望使用智能指针或按值存储所有内容,也就是说,我有一些函数的签名被预先定义为“为什么在存储指针时要返回引用?”为什么要问这样的问题?函数签名是一个公共接口,数据的存储方式是内部实现,一个根本不需要反映另一个。我不会说没有理由这么做,但要仔细考虑你在做什么。您将返回对共享对象的引用,而不增加引用计数。如果共享指针的引用计数为零,对象将被释放,您返回的引用现在将指向无效对象。@FrankBoyne当我返回shared\u ptr引用计数时increases@DanielMeltzer这不是我在Visual Studio 2017 C++或GDB中的经验。这是一个例子。运行该程序,共享指针调用~Target()析构函数并达到引用计数=0后,将出现分段错误。分叉代码并在调试器中运行它,您将看到即使在返回引用之后,共享指针的强引用计数仍为1。cpp.sh/3tgj5是一个exempale@DanielMeltzer硬币掉了。请注意,在方法
getPrice
中,返回类型为
std::shared_ptr
not
T&
的结果,这与您最初提出的问题相同(与您接受的答案相同)。如果您编辑原始问题以显示您想要的是
共享的结果,而不是
点&
,这将有助于未来的读者。如果@xirema更新他们的答案以反映这一变化,也会有所帮助。