C++ - "Funktion nimmt keine 0 Argumente." Behebung?
Schönen guten Abend!
Das Problem ist etwas anders als in der Frage, jedoch ist es für mich schwer dies in einem Satz zu erklären. Nun erstmal mein C++ Quellcode zum Verständnis:
#include <iostream>
int numbCount(int count);
int main()
{
int num1 = numbCount();
int num2 = numbCount(2);
...
}
int numbCount(int count = 1)
{
int userNumb;
std::cout << "Please enter the " << count << ". integer: ";
std::cin >> userNumb;
return userNumb;
}
Also, wie man sehen kann hat meine Funktion numbCount() Parameter. Außerdem bevorzuge ich es die Funktionsdefinition unter der Main() Funktion zu schreiben.
int numbCount(int count);
int main()
{
...
}
int numbCount(int count = 1)
{
...
}
Somit muss ich die Funktionsdeklaration über der Main() Funktion "erwähnen", damit ja der Compiler weiß, dass die Definition noch kommt. Dies scheint in diesem Fall bei einer Funktion mit Standardparameter für VS ein Problem darzustellen - Fehler "numbCount: function does not take 0 arguments".
Wenn ich jedoch die Funktionsdefinition von "numbCount()" über die Main() Funktion packe, funktioniert alles normal.
int numbCount(int count = 1)
{
...
}
int main()
{
...
}
Habe bereits versucht den Parameter in der "erwähnten" Funktionsdeklaration zwischen den runden Klammern ebenfalls einzufügen, also
int numbCount(int count = 1);
jedoch kommt dann der Fehler 'numbCount': redefinition of default argument: parameter 1
FRAGE:
Gibt es eine Möglichkeit in einer Funktion Standardparamter (also wenn kein Wert in Funktionsaufruf zwischen Klammern angegeben -> standardm. Wert 1) zu haben aber trotzdem die Funktionsdefinition unter der Main() Funktion zu belassen?
int numbCount(int count);
int main()
{
int num1 = numbCount(); // Kein Wert angegeben - Std. Wert 1
int num2 = numbCount(2);
}
int numbCount(int count = 1)
{
...
}
Vielen Dank und einen schönen Abend! :)
Warum packst du die Funktionsdefinitionen nicht in eine Header Datei?
Joah, hätte ich machen können, wobei ich noch im C++ Lernprozess bin und daher noch keine eigenen riesigen Programme schreibe, bei denen es sich anbietet, den Code aufzuteilen.
1 Antwort
Das geht, aber die delkaration über dem main muss hier gleich sein, also den Defaultwert enthalten!
In Deinem Fall hast Du ein mal den defaultwert und in der deklaration nicht!
Tatsächlich kommt der Defaultwert aus der deklaration und nicht aus der eigentlichen Funktion.
Ist die Funktion ihre eigene deklaration, steht also über dem main, dann funktioniert das natürlich da der optionale Parameter deklariert ist.
Und das geht nur in C++, bei C sind optionale Parameter nicht erlaubt!
In C++ wird die Funktion dann mit dem Defaultwert aus der Delkaration angesprungen. Die Funktion selber weiß ja nicht ob die den Defaultwert einsetzen muss oder nicht.
Zur Erklärung wie das aufrufen einer Funktion funktioniert.
Der Aufruf legt in der Reihenfolge in der die drin stehen die Variabeln auf einen Stack.
Die aufgerufene Funktion selber nimmt die in umgekehrter Reihenfolge vom Stack.
Die Funktion weiß nicht ob und was und wie auf den Stack gelegt wurde. Die nimmt nur Stur runter, auch wenn der Stack "ins Negative" gehen würde und irgendwelcher Müll gezogen wird und das Programm dann abstürzt weil der Stack kaputt ist.
Deswegen kann man bei C keine optionalen Parameter verwenden. Der Aufruf muss die exakte Anzahl an Bytes auf den Stack legen und die Funktion die gleiche Anzahl raus holen.
Bei C++ ist es erlaubt, optionale Werte zu haben. Hier wird dann beim Aufruf der Default wert genommen und in den STack gelegt damit die korrekte Anzahl von der Funktion genommen werden kann ohne einen Absturz aus zu lösen.
Deswegen muss der Aufruf den optionalen Wert kennen, die Funktion weiß davon gar nichts, die ist nicht in der Lage fest zu stellen ob und was fehlt!
Hey, einen schönen Nachmittag dir! :)
Achsööö! Vielen herzlichen Dank für die Erklärung! Wusste ich nicht. Hab das dann gleich nach lesen deines super hilfreichen Beitrags probiert und das funktioniert super. Dachte erst, dass würde zu einer Überladung führen war doch nicht so.
Vielen vielen herzlichen Dank für deine Mühe, deinen super hilfreichen Beitrag und dir einen wunderschönen Tag. ;)