funktionenpointer



  • hallo,
    also ich habe eine klasse die sich von einer array-klasse ableitet, allerdings als private, da der benutzer nicht direkt auf das array zugreifen darf. ich möchte dem nutzer allerdings erlauben das array zu sortieren und zwar mit einer sortierfunktion nach seinem belieben. es dürfen also die positionen der elemente aber die elemente selbst nicht geändert werden. die frage ist jetzt ob das geht und wenn ja wie. die sortierfunktion soll dann quasi als funktionpointer übergeben werden.
    als Beispiel

    template<class t>
    class A : private array<t>
    {
      //...
      public:
        A &sort(array<t> &(*sorting)(array<t> &))
        {
          if(sorting)
            return sorting(*this);
          return *this;
        };
      //...
    };
    

    also meine erste idee war sowas wie

    void sort(array<t> &(*sorting)(array<t const> &))
    

    allerdings funktioniert das auch nicht. also die frage ist ob es überhaupt geht nur die positionen ändern zu lassen, oder ob ich bei einem solchen funktionspointer immer das problem habe, dass der benutzer mit dem array quasi alles machen kann? damit wäre das ja dann eine hintertür um das private zu umgehen und alle standardmäßig zur verfügungstehenden public-funktionen von array zu nutzen, was ich ja eben verhindern wollte. der benutzer hat also nur lesenden zugriff auf das array und darf höchstens elemente innerhalb des arrays vertauschen, aber nicht ändern.
    vielen dank schonmal im voraus.



  • Ist jetzt n bisschen ne andere Idee, aber du könntest in deiner Klasse "A" Funktionen, wie "ArrSwap" oder so für das Array anbieten, auf welche der Benutzer dann zurückgreifen kann.



  • Deine Bedenken sind durchaus gerechtfertigt. Bei der Übergabe eines Funktionspointers, der lesenden und schreibenden Zugriff hat, kann das gesamte Array geändert werden.

    Entweder du machst es, wie Paul Manns gesagt hat, indem du nur eine Funktion zum Vertauschen zweier Elemente im Array zur Verfügung stellst, oder du hast eine Funktion, die ein int -Array als Parameter übernimmt. In diesem Array ist die neue Reihenfolge der Indizes gespeichert, sodass man zuerst eine Reihenfolge festlegt und an die Klasse übergibt. Die Klasse übernimmt dann die Sortierung selbsständig nach dieser Reihenfolge (natürlich nach einer Gültigkeitsprüfung).

    Beide Funktionen bedingen jedoch lesenden Zugriff auf einzelne Elemente des Arrays. Ich würde dazu eine Methode einrichten, die ein int für den Index als Parameter hat und eine Const-Referenz auf das jeweilige Array-Element zurückgibt.

    So, mein 1000. Beitrag in diesem Forum 😉



  • @FreakyBKA
    Mach es doch einfach so dass der Benutzer ein binary predicate übergeben kann, also so wie es z.B. std::sort auch macht.


Anmelden zum Antworten