c++ - 从 c++ 方法返回引用
问题描述
我有以下函数,它应该创建一个对象,插入一个数组并返回对该元素的引用。
Object& add(attr1, attr2,...).
我想知道当数组已满时如何返回空引用。在这种情况下有可能还是设计错误?
解决方案
您在这里有几个选择。C++ 不像 Python、Java 或 C#。引用只是现有值的别名。引用必须给某些东西起别名。这完全取决于你想要做什么。
以下是您的选择:
- 返回指针而不是引用。这样你就可以返回一个 nullptr。注意不要把它放到unique_ptr 或shared_ptr 中,或者删除它。
- 创建一个 Object 类型的特殊标记值并将其实例化为某处的静态变量。返回对它的引用而不是 null。这对非常量引用很危险,因为有人可能会更改哨兵对象。
- 如果这是表示错误或异常情况的罕见情况,请抛出异常。C++ 不是 Python,并且不应将异常用于常见的事情,例如在 Python 中使用 StopIteration。
- 使用动态容器而不是数组。也许
std::vector
,或者std::deque
。这样您就不会轻易耗尽空间。但这有使参考无效的危险。如果您害怕使引用无效,可以使用std::map
, 或unordered_map
将索引映射到对象。 返回
std::optional<std::ref<Object>>
。这种类型的变量x
可以通过以下方式访问:auto x = add(.....); if (x /* or x.has_value() */) { std::cout << x->get() << "\n"; x->get() = different_value; }
最后三个选项是最安全的。
推荐阅读
- google-cloud-platform - GCP Dataproc - 错误:“cluster.config”中的未知名称“optionalComponents”:找不到字段
- javascript - 如何在 iOS 中创建 WebGL 2 渲染器?
- node.js - 使用nodejs中的中间件将标头发送到客户端后无法设置标头
- javascript - 获取具体
- 使用 jquery 标记值
- flutter - 在谷歌地图颤动中设置标记
- c# - LINQ / C#从一个列表中删除多个其他列表中的所有项目
- cmake - cmake/ctest 生成 Test.xml(不重建?)/无法加载缓存
- firebase - PWA 在收到推送通知时监听事件(当应用程序未运行时)
- php - 如何使用 laravel 6 将我的网站配置为从 http 访问到 https
- python - Django 序列化程序返回 OrderdDict 而不是 JSON