【问题标题】:How to return "void value"? [duplicate]如何返回“空值”? [复制]
【发布时间】:2021-02-07 14:32:12
【问题描述】:

假设我有一门课

template <class T>
class c_array {
private:
    T* m_arr;
    int m_length = 0;

public:
    T pop() {
        if (m_length==0) {
            //???
        }

        m_length--;
        return m_arr[m_length];
    }
};

如果长度==0,我应该返回什么?

返回 NULL 会给出警告:

“警告:从 NULL [-Wconversion-null] 转换为非指针类型‘int’”

尝试

std::vector<int> vect;

int b = vect.pop_back();

给出错误“错误:应忽略的无效值”

【问题讨论】:

  • 通常用户希望检查容器是否为空。
  • 您需要返回一个有效的T。您会注意到 std::vector::pop_back 不会因为(大概)这个原因返回弹出的元素。如今,使用std::optional 可能是惯用的。
  • 这种情况可以抛出异常。

标签: c++


【解决方案1】:

如果长度==0,我应该返回什么?

有几种典型的处理方法。

  • 无论大小如何,都不要执行任何检查并执行相同的操作,并指定非空是一个先决条件。如果调用者违反前置条件,则行为未定义。这是最有效的选择,但也是最不安全的。
  • 中止程序。这不是很方便。
  • 当元素不存在时抛出异常,而不是返回值。
  • 这不适用于pop,但适用于将元素保存在容器中的类似函数:通常不是返回一个对象,而是返回一个迭代器。如果元素不存在,则返回一个表示不存在元素的迭代器。通常,使用指向末尾元素的迭代器。

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    相关资源
    最近更新 更多