c++ - 在 C++ 中返回一个指针实例变量
问题描述
我有一个带有指向另一个对象的指针的命令模式类(我们称之为 Duck)。它的子类将使用 Duck,但为了控制和跟踪何时使用 Duck(用于调试),我将 Duck 设为私有,子类只能通过 getDuck() 方法获取它;
class Command
{
private:
Duck* target;
public:
//Parametrized Constructor
Command(Duck* _target);
Duck* getDuck() { return target; }
...
};
我最近在Scott Myers 的Effective C++中了解到返回指针的可怕之处。我尝试只返回取消引用的版本,但这会导致返回目标副本。我应该(并且有办法)简单地返回一个 Duck 对象而不是指向它的指针吗?
解决方案
从概念上讲,有两种指针:拥有和非拥有。
拥有指针指示持有对象/函数拥有分配并负责删除该对象。
非拥有指针是“借来的”对象;持有对象/功能不拥有该对象,也不负责清理它。
理想情况下,这在自 C++11 以来的 C++ 类型系统中通过以下方式表现出来:
std::unique_ptr<T>
是指向T
对象的唯一所有权指针。恰好一个对象/函数可以拥有分配。std::shared_ptr<T>
是指向T
对象的共享所有权指针。许多对象/函数共享分配的所有权,只有当所有对象/函数都完成后,目标对象才会被删除。T *
是一个非拥有指针。这由函数返回以指示调用者不拥有该对象。调用者不应该删除对象;事实上,调用者可能不会删除它。一旦拥有的对象/函数破坏了目标对象,调用者就不会使用指针。
返回原始指针本身并没有错,尽管我只会在函数需要有条件地访问它拥有的对象时才返回指针:
T *
:该函数正在返回一个对象的非拥有句柄,但它可能没有对象,因此可以返回nullptr
。T *
是“可选的、非拥有的对象句柄”。T &
:该函数正在返回一个对象的非拥有句柄,并且它总是有这样一个对象要返回。T &
是“强制的、非拥有的对象句柄”。
请注意,并非所有标准库设施都会遵守这些准则;确实不是所有人都可以! new T
必须返回 a T *
,因为它是这样定义的。这些是您在应用程序中应遵循的准则。
推荐阅读
- git - 服务器修改时未触发预接收挂钩
- node.js - 如何为特定的 Kibana 插件运行测试
- selenium - 错误构建 VSTS - VSTest 任务 - OpenQA.Selenium.WebDriverException:对远程 WebDriver 服务器的 HTTP 请求以获取 URL
- eclipse-plugin - remotetestng 检测到 testng 版本 6.8.9 org testng testngexception
- reactjs - 隐藏在 Elastic Beanstalk 应用程序中可见的页面源?
- python - Python - 从零开始的 SVM 内核和算法
- python - 由于 python 将主机读取为元组而尝试套接字时键入错误
- php - 每次都需要使用 php artisan serve 吗?
- youtube - 频道的视频列表中缺少视频
- excel - Excel 2013 中的代码“无响应”。转换为公式/新代码