首页 > 解决方案 > 从 c++ 方法返回引用

问题描述

我有以下函数,它应该创建一个对象,插入一个数组并返回对该元素的引用。

Object& add(attr1, attr2,...).

我想知道当数组已满时如何返回空引用。在这种情况下有可能还是设计错误?

标签: c++

解决方案


您在这里有几个选择。C++ 不像 Python、Java 或 C#。引用只是现有值的别名。引用必须给某些东西起别名。这完全取决于你想要做什么。

以下是您的选择:

  1. 返回指针而不是引用。这样你就可以返回一个 nullptr。注意不要把它放到unique_ptr 或shared_ptr 中,或者删除它。
  2. 创建一个 Object 类型的特殊标记值并将其实例化为某处的静态变量。返回对它的引用而不是 null。这对非常量引用很危险,因为有人可能会更改哨兵对象。
  3. 如果这是表示错误或异常情况的罕见情况,请抛出异常。C++ 不是 Python,并且不应将异常用于常见的事情,例如在 Python 中使用 StopIteration。
  4. 使用动态容器而不是数组。也许std::vector,或者std::deque。这样您就不会轻易耗尽空间。但这有使参考无效的危险。如果您害怕使引用无效,可以使用std::map, 或unordered_map将索引映射到对象。
  5. 返回std::optional<std::ref<Object>>。这种类型的变量x可以通过以下方式访问:

    auto x = add(.....); if (x /* or x.has_value() */) { std::cout << x->get() << "\n"; x->get() = different_value; }

最后三个选项是最安全的。


推荐阅读