Permalänk
Medlem

C++ Function overloading

Hej

Håller på och läser en bok om C++ och har fastnat lite på en uppgift i slutet av ett kapitel.

Skriver ut uppgiften eftersom det antagligen är lättare än att jag förklarar det själv.

Using default arguments, write a function that asks the user for a number and returns that number.
The function should accept a string prompt from the calling code. If the caller doesn't supply a string for the prompt, the funtion should use a generic prompt. Next, using funtion overloading, write a funtion that achives the same result.

Så här långt har jag kommit, men har lite svårt att se hur jag ska använda function overload här.

#include <iostream> #include <string> using namespace std; int number_return(string prompt = "Enter a number: "); int main() { int number = number_return(); cout << "\n" << number << "\n"; return 0; } int number_return(string prompt) { int number_get; cout << prompt; cin >> number_get; return number_get; }

Permalänk
Medlem
Skrivet av http://en.wikipedia.org/wiki/Function_overloading:

Function overloading or method overloading is a feature found in various programming languages such as Ada, C++, C#, D, and Java, that allows creating several methods with the same name which differ from each other in the type of the input and the output of the function. It is simply defined as the ability of one function to perform different tasks.
For example, doTask() and doTask(object O) are overloaded methods.

Så för din kod så ska du ha två funktioner:
int number_return(string prompt)
och:
int number_return(void)

Använder man den första sa ska prompten se ut som argumentet och om den senare anropas sa ska den default prompt dyka upp.

Permalänk
Medlem

Alltså någonting sådant:

#include <iostream> #include <string> using namespace std; int number_return(); int number_return(string prompt); int main() { int number; string prompt = "Gimme a number, biatch: "; //alt: //string prompt = null; if(prompt == "" || prompt == null) number = number_return(); else number = number_return(prompt); cout << "\n" << number << "\n"; return 0; } int number_return() { int number_get; cout << "Enter a number: "; cin >> number_get; return number_get; } int number_return(string prompt) { int number_get; cout << prompt; cin >> number_get; return number_get; }

Har inte testat koden och är inte helt hundra på hur C++ syntax för strängar är.

Permalänk
Hedersmedlem
Skrivet av exodeus:

int number_return(string prompt)
och:
int number_return(void)

Här verkar det dock som att man skall använda standardargment, så med deklarationen

int number_return(string prompt = "Enter a number: ");

har man ju redan giltiga funktioner för både

number_return(<string>)

och

number_return()

Skrivet av Potric:

int number_return(string prompt = "Enter a number: ");

Med den här deklarationen kommer prompt sättas till "Enter a number: " om man anropar funktionen utan argument.

Permalänk
Medlem
Skrivet av Elgot:

Här verkar det dock som att man skall använda standardargment, så med deklarationen

int number_return(string prompt = "Enter a number: ");

har man ju redan giltiga funktioner för både

number_return(<string>)

och

number_return()

Det är en övning för att förstå vad funktion overloading är

Du har helt rätt i att standardargumenten är en snyggare lösning men uppgiften har väll två delar? Ena är via standardargument och den andra funktion overloading.

Alternativt sa kan du skriva main meto... funktionen! som sa:

int main() { int number; number = number_return("Gimme a number, biatch: "); //alt: //number = number_return(); cout << "\n" << number << "\n"; return 0; }

Permalänk
Hedersmedlem
Skrivet av exodeus:

Du har helt rätt i att standardargumenten är en snyggare lösning men uppgiften har väll två delar?

Äsch, jag missade visst den sista meningen.

Permalänk
Medlem

Första uppgiften:

Citat:

Using default arguments, write a function that asks the user for a number and returns that number.
The function should accept a string prompt from the calling code. If the caller doesn't supply a string for the prompt, the funtion should use a generic prompt.

Andra uppgiften:

Citat:

Next, using funtion overloading, write a funtion that achives the same result.

Permalänk
Medlem
Skrivet av exodeus:

Det är en övning för att förstå vad funktion overloading är

Du har helt rätt i att standardargumenten är en snyggare lösning men uppgiften har väll två delar? Ena är via standardargument och den andra funktion overloading.

Alternativt sa kan du skriva main meto... funktionen! som sa:

int main() { int number; number = number_return("Gimme a number, biatch: "); //alt: //number = number_return(); cout << "\n" << number << "\n"; return 0; }

Aha, nu förstår jag hur det funkar. Men då är väl den lösningen med default arguments lite bättre? Blir ju mindre kod.
Tack för svar för den delen.

Permalänk
Medlem
Skrivet av Potric:

Aha, nu förstår jag hur det funkar. Men då är väl den lösningen med default arguments lite bättre? Blir ju mindre kod.
Tack för svar för den delen.

Du är välkommen!

Bättre och bättre... hmm... beror på villka metrics du använder?

C++ koden översätts till binärkod genom kompilatorn, som gör optimeringar. Jag tror att de bägge lösningarna kommer vara väldigt lika i slutändan. Så snabbhet och resurseffektivitet är ungefär lika och kommer variera beroende på villken kompilator du använder.

För detta exempel är det mindre kod med defaultargumenten och därmed snyggare. Men det är också mer fragmenterat. Vad är defaultargumentets värde? det måste du kolla upp i funktionsdeklarationen och du måste hoppa mellan rader och filer.

Men säg att du vill agera mer på vad argumenten är? Om defaultargumentet används så ska du fråga efter två tal t.ex.? Då måste du bygga en if-else konstruktion i default-argument-funktionen. I de överlagrade vet du att du ska fråga två gånger i den ena men inte i den andra.

Beror alltså på omständigheterna :).

Permalänk
Medlem

Sista svaret, jag lovar!

Jag löser vanligen denna typ av problem genom att göra så här:

int number_return() { return number_return("Enter a number: "); } int number_return(string prompt) { int number_get; cout << prompt; cin >> number_get; return number_get; }