从C ++方法返回引用

时间:2018-07-30 12:45:11

标签: c++

我具有以下功能,该功能应该用于创建对象,插入数组并返回对该元素的引用。

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

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

1 个答案:

答案 0 :(得分:0)

您在这里有几种选择。 C ++与Python,Java或C#不同。引用只是现有值的别名。引用必须别名。这完全取决于您要执行的操作。

以下是您的选择:

  1. 返回指针而不是引用。这样,您可以返回nullptr。注意不要将其放入unique_ptr或shared_ptr或将其删除。
  2. 设置一个特殊的Object类型的哨兵值,并将其实例化为某个静态变量。返回对此的引用,而不是null。对于非const引用,这很危险,因为有人可能会更改哨兵对象。
  3. 如果这是罕见的情况,表明存在错误或异常情况,请抛出异常。 C ++不是Python,并且不应将异常用于诸如Python中使用StopIteration之类的常见事情。
  4. 使用动态容器而不是数组。也许是std::vectorstd::deque。这样,您将不会轻易用完空间。但这有使参考无效的危险。如果您害怕使引用无效,则可以使用std::mapunordered_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; }

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