【问题标题】:Remove warning: "variable 'result' is used uninitialized whenever 'if' condition is false" in c++删除警告:“当'if'条件为假时,变量'result'被使用未初始化”在c ++中
【发布时间】:2020-03-24 23:52:03
【问题描述】:

我看到过与此类似的问题,但没有一个对我有帮助,因为我找不到使用模板的问题。 对于家庭作业,我必须编写一个可用于任何类型变量的堆栈,因此我决定使用模板。这阻止了我初始化变量,我的代码给了我一个关于函数 pop() 的警告,谁能给我关于如何删除此类警告的建议?

我的函数 pop():

template<typename T>
    T stack<T>::pop(){
        T result;
        if(!empty()){
            result = tos->data;
            Node<T> *tmp = tos;
            tos = tos->next;
            delete tmp;
        }else{
            std::cerr<<"ERROR empty stack"<<std::endl;
        }
        return result;
    }

【问题讨论】:

  • 提示:不要删除警告。 改为修复错误
  • 在使用之前将 result 初始化为一个值。在没有初始化的情况下,根据T 的类型,T result 的定义可以使T 未初始化——例如,如果T 是int。如果!empty() 不正确,则到达else,而result 未初始化。 return result 然后将具有未定义的行为(因为它访问未初始化变量的值)。
  • 我不相信初始化 T 因为没有我可以预测的类型,我必须同时使用我们实现的字符串类和 int 用于该项目的未来部分。我想不出一种初始化它的方法,所以它对他们俩都有效。据我所知,我的字符串类将被初始化为我的默认构造函数的规范,而 int 将被初始化。

标签: c++ templates stack


【解决方案1】:

您的pop() 方法应该在遇到无法处理的问题时抛出异常,而不是简单地打印到std::cerr。静默失败并返回一个未初始化的对象会在以后引起问题。

你可以这样抛出异常:

//...
else {
    throw std::runtime_error("ERROR empty stack");
}
//...

然后,您只需在 if 语句的 true 分支中声明 result。

【讨论】:

  • 值得注意的是std::dequeue 选择了单独的get_back 和pop_back 方法,因为pop 在空的情况下以一种有用的方式处理可能有点棘手。现在可能会抛出异常或返回std::optional
  • 这行得通!谢谢!我的教授也终于回复了我上周发送的电子邮件,显然我可以在从堆栈中弹出一个元素之前使用 assert(!empty())。不过我会用这个,因为它看起来更整洁。
猜你喜欢
  • 2021-06-03
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
相关资源
最近更新 更多