Ist eine Funktion, die einen Wert zurückgibt, möglich, die Funktion unter einer bestimmten Bedingung zu verlassen, ohne etwas zurückzugeben? Wenn ja, wie können Sie das erreichen?
Beispiel:
%Vor%Also sagen Sie, Sie sind in dieser Funktion. Gibt es eine Möglichkeit, es zu verlassen, ohne etwas zu tun?
Sie könnten mit einem return;
ohne Rückgabewert davonkommen. Der Compiler wird warnen, aber möglicherweise keinen Fehler.
ABER Warum in aller Welt würdest du darüber nachdenken? Was versuchst du zu erreichen?
Und wie sieht der Anrufcode aus? Wenn es int someVar = getNumber();
ist, ist der Wert von someVar nicht definiert (was A Bad Thing ist).
Es klingt für mich so, als würden Sie zwei Informationen zurückgeben, von denen eine Ihnen sagt, ob die andere gültig ist.
Versuchen Sie etwas wie
%Vor%Machen Sie es zu einer Voraussetzung für den Benutzer, zuerst zu überprüfen, dass die Warteschlange nicht leer ist (dafür sorgen).
Dann können Sie:
Das Überprüfen und anschließende Aufrufen von undefiniertem Verhalten (das Zurückgeben eines willkürlichen Wertes) ist das Schlimmste, was zu tun ist. Sie erhalten sowohl den Laufzeit-Overhead des Checks als auch den Aufrufer nicht weiser, da das Ergebnis immer noch undefiniert ist.
Sie könnten eine bestimmte Ausnahme auslösen und sie entsprechend abfangen.
Sie können auch eine Klasse / Struktur mit einer magischen Umwandlung zurückgeben, die für Ihre speziellen Bedürfnisse nützlich ist.
Beispiel aus der Praxis: Einmal musste ich tatsächlich zwei Informationen im selben Rückgabewert zurückgeben, einen Wert, der gemeldet wurde, wenn eine Nachricht vollständig verarbeitet wurde, und den Wert, der zurückgegeben werden musste, wenn die Verarbeitung bereits abgeschlossen war . Also habe ich alles in so einer Klasse verpackt:
%Vor% Dies erlaubte mir, return false;
in einer Funktion zu verwenden, die einen MessageReturnValue zurückgab, wenn die Nachricht noch verarbeitet werden musste, oder in return TRUE/15/whatever;
, wenn die Nachricht vollständig verarbeitet worden war und ich bereits einen Rückgabewert hatte. Der Anrufer konnte auf der Seite einfach
Wenn Sie komplexere Anforderungen haben, können Sie auch boost :: tuple verwenden.
Sie könnten eine Ausnahme auslösen. Sie würden nichts zurückgeben, aber Sie müssen die Ausnahme abfangen, um zu bestimmen, was als nächstes zu tun ist (Sie könnten die Ausnahme immer schlucken und nichts tun, um zu erreichen, was Sie wollen).
Was ist Ihr tatsächlicher Anwendungsfall?
Wenn Sie wirklich nichts zurückgeben und die Ausführung der normalen Funktion beenden müssen, können Sie eine Ausnahme auslösen .
Sie können auch etwas zurückgeben, das der Aufrufer als Fehler interpretiert (oder "nichts zurückgegeben" hat).
Was auch immer Ihre Lösung ist, der Anrufer muss den Fall "nichts zurückgegeben" separat behandeln, z. Fangen Sie die Ausnahme oder überprüfen Sie den zurückgegebenen Wert.
Tags und Links c++