Что означает «предупреждение: не все пути управления возвращают значение»? (C ++) - PullRequest
1 голос
/ 30 мая 2009

Точное предупреждение, которое я получаю,

warning C4715: 'hand::show' : not all control paths return a value

и hand :: show is

std::ostream& hand::show(std::ostream& os) const
{
    if(side == left)
    {
        return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
    }
    if(side == right)
    {
        return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
    }
}

где сторона - это переменная ориентации типа

orientation{
    left = -1,
    right = 1
};

Что означает предупреждение, и что было бы лучшим решением, чтобы избавиться от него?

Ответы [ 7 ]

13 голосов
/ 30 мая 2009

Ваш компилятор не достаточно умен, чтобы учесть, что для side есть только две опции left и right, поэтому он считает, что невозможно выполнить ни одну инструкцию возврата. Когда side не является ни left, ни right, ваша функция не сообщает, какое значение вернуть.

7 голосов
/ 30 мая 2009

Ошибка означает, что если сторона не является ни левой, ни правой, ваша функция не будет возвращать значение - либо сторона объявлена ​​неправильно, либо ваше перечисление равно. Перечисление должно быть определено как

enum orientation {left, right};

Так что попробуйте изменить структуру ориентации на это.

6 голосов
/ 30 мая 2009

Если side не равно left или right, возвращаемое значение не определено.

Несмотря на то, что orientation - это перечисление только с двумя значениями (прямо сейчас), оно может иметь другое значение по любой из следующих причин:

  • В будущем вы можете изменить заголовок, включив в него другие значения, поэтому защитное программирование предполагает, что это произойдет (и ваш компилятор работает хорошо и предупреждает вас сейчас).
  • side может быть неинициализирован, поэтому не может быть ни left, ни right
  • side могло бы быть присвоено другое значение посредством приведения типов, например *((int*)&side) = 2

Возможные решения включают в себя:

  • Заменить второе if на else, как предложено в sth.
  • Измените его на:

    if(side == left) {
        return ...;
    } else if(side == right) {
        return ...;
    } else {
        ...handle error...
    }
    
4 голосов
/ 30 мая 2009

Предупреждение означает, что можно пройти через ваш метод, не возвращая никакого явного значения. С вашим кодом:

std::ostream& hand::show(std::ostream& os) const
{
    if(side == left)
    {
        return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
    }
    if(side == right)
    {
        return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
    }
}

если side != left и side != right, то вы ничего не возвращаете. Обычный способ решения этой проблемы - предположить, например, что если не «влево», то всегда принимать «вправо»:

std::ostream& hand::show(std::ostream& os) const
{
    if(side == left)
    {
        return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
    }
    return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
}
3 голосов
/ 30 мая 2009

Вы можете сделать то, что сказал, или, так как в этом случае вы действительно возвращаете то же самое в любом случае ...

std::ostream& hand::show(std::ostream& os) const
{
    if(side == left)
    {
        os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
    }
    else
    {
        os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
    }
    return os;
}
2 голосов
/ 30 мая 2009

Чтобы избавиться от предупреждения, замените второй if на else:

std::ostream& hand::show(std::ostream& os) const
{
    if(side == left)
    {
        return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
    }
    else
    {
        return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
    }
}
1 голос
/ 30 мая 2009

Как полагают другие, проблема в том, что ваш side может быть ни left, ни right.
Вы можете изменить свою функцию для выполнения любого из следующих действий:

  1. замените второй оператор if на else или удалите условие все вместе, поскольку, если сторона не слева, она должна быть права.
  2. следуйте совету Натаниэля Флата и измените тип ориентации на enum.
  3. возбудить исключение в качестве последнего оператора функции.
...