Rückgabe von Funktion
-
Hallo zusammen,

ich hoffe, ich bin hier richtig mit meinem Thema gelandet!
Zu meinem Problem: Ich schreibe derzeit eine kleine Erweiterung und habe eine Funktion in einer Datei definiert. Die Funktion führt einen HTTP-Request aus, wobei mir die Funktion bei Erfolg true und im Fehlerfall false liefert. Die Funktion selbst führe ich aber in einer völlig anderen Datei, trotzdem in der selben DLL-Datei aus.
Mein folgendendes Problem ist derzeit das: Ich möchte die Ausgabe vom HTTP-Request erhalten, sowie den HTTP-Status (Code) aber auch trotzdem die Rückgabe von true bei Erfolg. Andernfalls im Fehlerfall, false.
Wie lässt sich das am besten Umsetzen?! Die Rückgabe vom HTTP-Status (Code) sowie die Rückgabe erhalte ich. Auch die Rückgabe von true/false. Es hapert eben nur an der Rückgabe mit dem HTML-Status (Code) sowie die Rückgabe.. Ich möchte es gerne "sauber" lösen, habe auch bereits an eine Globale Variable gedacht.....

-
Bitte keine Globale! Wenn du mehrere Rückgaben realisieren willst, kannst du entweder eine Struktur definieren, die dann alle Werte enthält (die kannst du dann ganz normal per return zurückgeben), oder mehrere by-reference Parameter für die Funktion definieren (entweder per Zeiger oder per C++-Referenz).
Beispiel (by-reference):
bool myFunc(int par1, int& refPar1, std::string& refPar2) { refPar1=par1; refPar2="Hallo main!"; return true; } int main() { int i; std::string s; myFunc(123,i,s); return 0; //i hat nun den Wert 123 und s "Hallo main!" }
-
Vielen Dank!, hat soweit einwandfrei geklappt!

Hatte zwar anfangs Probleme.., weil ich nicht die Funktion in der *.h eingetragen habe. Aber nachdem ich es dort'n eingetragen habe und in der gleichnamigen *.cpp ebenfalls die Funktion deklariert habe, konnte ich sie in der test.cpp aufrufen!

Aber ich werde wohl zu einer Singleton-Methode übergreifen müssen.. ich werde mich mal später genauer reinlesen! Aber vielen dank noch einmal.. das hat mir großes Kopfzerbrechen seit Tagen bereitet.. wobei mir sogar von Globalen Variablen abgeraten wurde und ich es bereits als Notlösung ansah!

-
_matze schrieb:
Beispiel (by-reference):
...Ist zwar legal, tut das was du erwartest, ist aber sehr unintuitiv. Im Normalfall erwartet man, dass Funktionsparameter in der Funktion verarbeitet werden und das was die Funktion "erzeugt" im Rückgabetyp zu finden ist. In deinem Fall werden 2 von drei Funktionsparametern nur als "out"-Parameter benutzt, wie gesagt technisch legal sein mag und in anderen Sprachen auch gang und gäbe ist, in C++ aber eher unüblich. Ich würd eher sowas machen:
struct httpResponse { bool success; int httpStatus; std::string responseText; }; httpResponse myFunc(/* input-Parameter */) { httpResponse response; response.success = !httpRequestFailed(); response.httpStatus = someStatusReturnedByTheRequest; response.responseText = granniesApplePieRecipe; return response; }
-
Dafür, dass es unüblich ist, habe ich das aber schon sehr oft gesehen.
Außerdem würde ich das von der jeweiligen Situation abhängig machen. Wenn es viele Rückgaben sind, die man realisieren will, ist eine Struktur sicher geeigneter (diese Möglichkeit hatte ich übrigens auch erwähnt). Wenn es nur ein, zwei sind, dann finde ich den Weg per by-reference-Parameter durchaus gangbar. Der hat eventuell auch den Vorteil, dass man die Funktion mit z.B. bool-Rückgabe in Ausdrücken verwenden kann (wenn man das für die spezielle Funktion haben möchte). Und in Spezialfällen (Rekursion?) will man vielleicht lieber das Kopieren von Werten verhindern und ist mit Referenz/Zeiger besser bedient. Aber wie gesagt, ich würde es als situationsabhängig ansehen.EDIT: In diesem Fall gebe ich dir aber Recht, macht schon mehr Sinn so.
-
nunu schrieb:
Die Funktion führt einen HTTP-Request aus, wobei mir die Funktion bei Erfolg true und im Fehlerfall false liefert.
Hast du auch schon über eine Exception nachgedacht? Dann kann die Funktion einfach das Ergebnis zurück liefern.
-
War auch bereits in Überlegung gewesen, aber die genannten Methoden klappen einwandfrei und bin zufrieden! So muss ich den Exception-Handler nicht für andere zwecke nutzen. *G*