Verständnisfrage zum Thema Funktionsüberladung



  • Hallo,

    ich bin gerade beim Thema Funktionsüberladung und habe da mal ein wenig rumgespielt.

    #include <iostream>
    using namespace std;
    
    int maximum (int x, int y, int z)
    {
    	int maximumValue = x;
    
    	if (y > maximumValue)
    	{
    		maximumValue= y;
    	}
    
    	if (z > maximumValue)
    	{
    		maximumValue=z;
    	}
    
    	return maximumValue;
    }
    
    double maximum (double x, double y, double z)
    {
    	double maximumValue = x;
    
    	if (y > maximumValue)
    	{
    		maximumValue= y;
    	}
    
    	if (z > maximumValue)
    	{
    		maximumValue=z;
    	}
    
    	return maximumValue;
    }
    
    void displayMessage(a, b, c)
    {
    	int maximumTest = maximum (a, b, c);
    	cout << "Maximum: " << maximumTest << endl;
    }
    
    int main()
    {
    	displayMessage(1, 2, 3);
    	displayMessage(5.2, 6.3, 7.4);
    
    	system("PAUSE");
    	return 0;
    }
    

    Der oben genannte Quelltext funktioniert natürlich nicht, weil a,b,c nicht deklariert sind, was zu meiner Frage führt:

    Sehe ich es richtig, dass ich eine Funktionsüberladung niemals mit den Parametern einer anderen Funktion aufrufen kann, weil ich eben diese Parameter vorher mit Typ deklarieren muss und ich somit eine überladene funktion, die sich nur in ihren Typen unterscheidet niemals unterschiedlich aufrufen kann?

    würde ich in der main die funktion maximum einmal mit maximum(1,2,3) und einmal mit maximum(2.3, 3.4, 4.5) aufrufen würde ja jeweils die jeweilige funktion aufgerufen.

    Oder gibt es einen Weg die Parameter einer anderen Funktion typenlos zu übergeben?

    *hüstel* Ich kanns nicht besser beschreiben, vielleicht klingt die Frage auch doof, es geht hierbei eher um mein Verständnis.



  • Deine Frage ist ein wenig konfus, aber die Antwort ist auf jeden Fall Templates:

    template <typename T>
    void displayMessage(T a, T b, T c)
    {
        int maximumTest = maximum(a, b, c);
        cout << "Maximum: " << maximumTest << endl;
    }
    

    Da sagst Du C++, dass die Funktion mit beliebigen Typen funktionieren soll (vorausgesetzt, für diese Typen ist eine Funktion 'maximum' definiert, sowie die Ausgabe per operator << ).



  • Übrigens ließe sich auf die Funktion 'maximum' als Template schreiben, und desweiteren entschieden vereinfachen:

    template <typename T>
    T maximum(T a, T b, T c) {
        return a < b ? (b < c ? c : b) : (a < c ? c : a);
    }
    

    Das macht dieselben Abfragen, aber in konziserer Form. Optimalerweise kann man auch die bereits existierende Funktion 'std::maximum' verwenden, welche auf Array anwendbar ist.



  • Oder für die beiden Typen auch displayMessage überladen:

    void displayMessage(int a, int b, int c)
    {
        cout << "Maximum: " << maximum (a, b, c) << endl;
    }
    
    void displayMessage(double a, double b, double c)
    {
        cout << "Maximum: " << setpricision(2) << maximum (a, b, c) << endl;
    }
    

    und schon sollte auch das gehen 😉



  • Hm okay... danke für den Ausblick, aber ich glaube, das ihr meinen Verdacht bzw Verständnis der Funktionsüberladung zumindest bestätigt habt (wenn ich nunmal von Termplates absehe, die ich noch nicht im Buch hatte 🙂

    Danke


Anmelden zum Antworten