2009-05-30 6 views
2

Die genaue Warnung, die ich bekommen istWas bedeutet "Warnung: nicht alle Steuerpfade geben einen Wert zurück"? (C++)

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

und Hand :: Show ist

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]; 
    } 
} 

wo Seite ist eine Variable vom Typ Orientierung

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

Was die Warnung tut meine, und was wäre die beste Lösung, um es los zu werden?

Antwort

11

Ihr Compiler ist nicht intelligent genug, zu berücksichtigen, dass die nur zwei Möglichkeiten für side sind left und right, also denkt es, dass es möglich ist, dass keine return-Anweisung ausgeführt wird. Wenn side weder left noch right ist, sagt Ihre Funktion nicht, welchen Wert zurückgegeben werden soll.

7

Der Fehler bedeutet, dass wenn Ihre Seite weder links noch rechts ist, Ihre Funktion keinen Wert zurückgibt - beide Seiten werden falsch deklariert oder Ihre Enum ist. Eine Enumeration sollte wie folgt definiert werden:

enum orientation {left, right}; 

Also versuchen Sie, Ihre Orientierungsstruktur dahin zu ändern.

4

Die Warnung bedeutet, dass es möglich ist, die Methode zu durchlaufen, ohne einen expliziten Wert zurückzugeben. Mit Code:

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]; 
    } 
} 

wenn side != left und side != right, dann kehren Sie nichts. Ein üblicher Weg, um dieses Problem der Festsetzung ist anzunehmen, zum Beispiel, wenn nicht „links“ dann immer „richtig“ annehmen:

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]; 
} 
2

der Warnung loszuwerden, die zweiten if mit einem else ersetzen:

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]; 
    } 
} 
3

können Sie tun, was eine Sache sagen, oder, da man in diesem Fall ist wirklich die gleiche Sache so oder so zurück. ..

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; 
} 
1

Wie andere vorschlagen, das Problem ist, dass Ihr side weder left noch right sein könnte.

  1. Änderung der zweiten if-Anweisung zu einem anderen, oder entfernen Sie den Zustand alle zusammen, da, wenn die Seite nicht verlassen wird, ist es richtig sein muss:
    Sie können Ihre Funktion einen der folgenden ändern.
  2. folgen Sie dem Vorschlag von Nathaniel Flath und modifizieren Sie den Ausrichtungstyp zu einer Enumeration.
  3. eine Ausnahme als letzte Anweisung der Funktion auslösen.
6

Wenn side nicht left oder right, dann ist der Rückgabewert undefiniert ist.

Obwohl orientation eine Enumeration mit nur zwei Werten ist (jetzt), kann es noch einen anderen Wert für eine der folgenden Gründe haben:

  • In Zukunft können Sie den Header ändern schließen andere Werte in der enum, so ist es defensive Programmierung anzunehmen, dass dies passieren wird (und Ihr Compiler ist nett und warnt Sie jetzt).
  • side könnte nicht initialisiert werden, so dass es weder sein könnte left noch right
  • side könnte einen anderen Wert über eine Schublade gesteckt zugewiesen wurden, z.B. *((int*)&side) = 2

Mögliche Lösungen:

  • Ersetzen Sie die zweite if mit einem else wie etw vorgeschlagen.
  • ändern es zu sein:

    if(side == left) { 
        return ...; 
    } else if(side == right) { 
        return ...; 
    } else { 
        ...handle error... 
    }