2014-07-07 45 views
-3

这是我目前正在处理的代码位,我似乎无法找出一种方法来使此函数停止抛出“控制达到非-void函数“错误。 else语句是否应该捕获if语句没有的任何内容,并返回true或false?控制达到bool函数中非void函数的结束

bool operator == (const MyInt& x, const MyInt& y) 
{ 
    if (x.currentSize != y.currentSize) 
    { 
     return false; 
    } 
    else 
    { 
     for (int i = 0; i < x.currentSize; i++) 
     { 
       if (x.integer[i] != y.integer[i]) 
       { 
        return false; 
        break; 
       } 
       else 
        return true; 
     } 
    } 
} 
+2

如果'x.currentSize'和'y.currentSize'都为零,会发生什么? – user4815162342

+1

你有一些不可达的代码。你永远不会真的得到这个突破声明。 – genisage

+1

'} // <<<<<<<<<<<< ************* !!!!!!'最后简单吗?您从警告/错误信息中不能理解什么?把'return false; }'或'返回true;而不是。我不知道你的实际用例是什么(TL; DR;)。 –

回答

2

如果x.currentsize == 0y.currentsize == 0,那么你将永远不会达到一个return声明。

我觉得你打算写下面的代码。请注意,一旦我们测试了整个列表,我们只有return true

bool operator==(const MyInt& x, const MyInt& y) 
{ 
    if (x.currentSize != y.currentSize) 
     return false; 
    for (int i = 0; i < x.currentSize; i++) 
     if (x.integer[i] != y.integer[i]) 
      return false; 
    return true; 
} 
+0

@ user4815162342哎呀。你是对的。 –

2

你必须把第一else回报,如果你的方法不通过去循环,例如,当x.currentSize = 0

此外,您if条件总是后返回一个值第一次迭代,所以你应该改变它这个样子,所以你可以检查所有元素在这样的误区Array

bool operator == (const MyInt& x, const MyInt& y) 
{ 
    if (x.currentSize != y.currentSize) 
    { 
     return false; 
    } 
    else 
    { 
     for (int i = 0; i < x.currentSize; i++) 
       if (x.integer[i] != y.integer[i]) 
        return false; 
     return true; 
    } 
} 
+0

请注意,for循环将永远不会测试'x.integer [1]!= y.integer [1]',因为我们已经打破了循环。 –

0

一般的原因是糟糕的代码是难以阅读。

重写功能通过以下方式

bool operator ==(const MyInt &x, const MyInt &y) 
{ 
    if (x.currentSize == y.currentSize) 
    { 
     int i = 0; 
     while ( i < x.currentSize && x.integer[i] == y.integer[i]) i++; 

     return (i == x.currentSize); 
    } 

    return (false); 
} 

或者,如果integer是一个指针或数组,那么你可以应用标准算法std::equal在头<algorithm>声明。例如

#include <algorithm> 

//... 
bool operator ==(const MyInt &x, const MyInt &y) 
{ 
    return (x.currentSize == y.currentSize && 
      std::equal(x.integer, x.integer + x.currentSize, y.integer)); 
} 

我认为这段代码看起来好多了不是吗?

+1

不,它看起来不太好。用'return false;'语句替换外部'else'子句。顺便说一句,'return'不是一个函数,因此括号不是必需的。 –

+0

@Thomas Matthews看起来好多了。当然其他的东西可以被删除,但这是一个品味问题。至于返回,那么fot示例如果语句也不是一个函数,catch不是一个函数。在返回之后有一个表达式,并且从表达式中分离关键字返回是一个好主意。 –

+0

@Thomas Matthews我删除了其他声明。:) –

相关问题