Funktionen überladen



  • Hi

    ich will mir ne Klasse basteln

    Da wollte ich auch gleich mal das überladen von Funktionen testen. Na und nun ist der Compiler überhaupt nicht mehr glücklich (ich ebenfalls).

    class xyz
    {
      void Delete(AnsiString Interpret);
      void Delete(AnsiString Interpret, AnsiString Album); // <--
      void Delete(AnsiString Interpret, AnsiString Album, AnsiString Titel);
      void Delete(AnsiString Interpret, AnsiString Titel); // <--
    }
    

    Als Fehler bringt er:
    *
    [C++ Error] db.h(25): E2238 Multiple declaration for 'CDatabase::Delete(AnsiString,AnsiString)'
    [C++ Error] db.h(23): E2344 Earlier declaration of 'CDatabase::Delete(AnsiString,AnsiString)'
    *
    Anscheinend darf ich keine zwei Funktionen nach dem Typ 'CDatabase::Delete(AnsiString,AnsiString)' machen. Ist auch logisch...
    Kann ich dies irgendwie umgehen??



  • Nö, da wirst Du einen dritten Parameter hinzunehmen müssen damit ein
    Unterschied reinkommt.

    Beispiel:

    void Delete(AnsiString Interpret, AnsiString Album,bool Album = true); // <--
    


  • Woher soll der Compiler denn bei zwei Funktionen mit den gleichen Parametern wissen, welche er aufrufen soll?

    a.Delete("a", "b"); // welche Funktion soll aufgerufen werden?
    


  • cd9000 schrieb:

    Woher soll der Compiler denn bei zwei Funktionen mit den gleichen Parametern wissen, welche er aufrufen soll?

    a.Delete("a", "b"); // welche Funktion soll aufgerufen werden?
    

    Das ist mir ja auch klar...

    Knuddlbaer schrieb:

    Nö, da wirst Du einen dritten Parameter hinzunehmen müssen damit ein
    Unterschied reinkommt.

    Ist das aber echt die einzige Lösung. Find ich nicht so optimal 🙄



  • Dann würde ich die Funktionen nicht überladen.
    Wenn die unterschiedliche Namen haben, gehts nämlich auch. 😉



  • cd9000 schrieb:

    Dann würde ich die Funktionen nicht überladen.
    Wenn die unterschiedliche Namen haben, gehts nämlich auch. 😉

    das scheint mir echt auch die beste Lösung zu sein



  • Ein anderer Ansatz wäre eine kleine Klasse zu basteln, die einen AnsiString.

    struct Titel {
       Titel (const AnsiString & name)
          : titel(name)
       {}
       AnsiString titel;
    };
    
    Und dann überlädst du
    

    Delete(const AnsiString &, const Titel &)
    [cpp]

    Ein aufruf wäre dann foo.Delete("Der und der", Titel("was weiß ich")).



  • ja wär sicher auch ne Möglichkeit. danke. Aber ich mach das ganze nun ohne überladen. Ist zwar nicht so schön, aber was solls? Den Source sieht ausser mir ja niemand 😉



  • eine andere möglichkeit wäre noch:
    lass die funktion intern quasi "raten", ob Autor oder titel gemeint ist 😉



  • davie schrieb:

    eine andere möglichkeit wäre noch:
    lass die funktion intern quasi "raten", ob Autor oder titel gemeint ist 😉

    ja, und dann natürlich mit berechnen der Wahrscheinlichkeit... Das letzte mal war's nen Titel, dann ist's diesmal eher einAutor 😃 😃



  • naja, so auch nicht.
    du hast ja irgendwo titel und autor abgespeichert, du lässt dann einfach durchlaufen, wenn du nen titel findet, der passt, wird das gelöscht, wenn ein autor gefunden wird eben der.



  • hm...
    und wenn Titel und Autor? (Interpret) den gleichen Wert haben. Dann wird's extrem schwer..



  • genau. und genau vor so einem problem steht dein compiler 🙂
    heliums idee finde ich gut, aber du könntest auch:

    class Autor_flag {} Autor;
    class Titel_flag {} Titel;
    
    void Delete(AnsiString Interpret, AnsiString Crit, Autor_flag);
    void Delete(AnsiString Interpret, AnsiString Crit, Titel_flag);
    
    //...
    Delete ("foo", "bar", Autor);
    

    es gibt aber unendlich viele möglichkeiten, das aufzulösen.
    such/denk dir das passende aus.


Anmelden zum Antworten