为何含return语句仍触发“控制到达非void函数末尾”警告?
解决“control reaches end of non void function”警告问题
嘿,这个警告的原因其实很明确——你的insertAfter函数是返回DataType*的非void函数,但只有在找到匹配的target时才会执行return语句。如果遍历完整个数组都没找到target,程序就会走到函数的末尾,此时没有任何返回值返回给调用者,编译器当然会抛出这个警告啦。
先看看你的代码:
DataType * ArrayList::insertAfter(const DataType & target,const DataType & value){ // *This function replaces an array element with a parameter (DataType objects)* for(size_t i = 0 ; i < m_size ; i++){ if (m_array[i] == target){ m_array[i+1] = value; return &m_array[i+1]; } } }
你看,for循环里的return只有在m_array[i] == target成立时才会触发。如果循环正常结束(也就是没找到任何匹配的元素),函数就没有后续的return逻辑,这就违反了非void函数必须返回值的规则。
两种常见的修复方案:
方案1:返回空指针表示插入失败
如果你的业务逻辑允许没找到target时返回空指针,那就在循环结束后添加一行return语句:DataType * ArrayList::insertAfter(const DataType & target,const DataType & value){ for(size_t i = 0 ; i < m_size ; i++){ if (m_array[i] == target){ m_array[i+1] = value; return &m_array[i+1]; } } // 没找到匹配元素时返回空指针 return nullptr; }方案2:抛出异常明确报错
如果你的程序逻辑要求必须找到target(也就是不允许出现找不到的情况),那可以在循环结束后抛出一个异常,让调用者知道发生了错误:#include <stdexcept> // 需要包含异常头文件 DataType * ArrayList::insertAfter(const DataType & target,const DataType & value){ for(size_t i = 0 ; i < m_size ; i++){ if (m_array[i] == target){ m_array[i+1] = value; return &m_array[i+1]; } } // 没找到目标元素时抛出异常 throw std::runtime_error("Target element not found in ArrayList"); }
另外还要提醒你一个潜在的bug:当i等于m_size-1时,m_array[i+1]就是数组的第m_size个元素,如果你的数组容量刚好等于m_size,这会导致数组越界访问,记得检查数组的容量是否足够容纳这个操作哦!
内容的提问来源于stack exchange,提问作者PLAYN BOY
相关产品推荐
相关产品推荐

