Friend-Funktion



  • Hallo liebe Community!
    Ich habe bei einer Aufgabe ein kleines Verständnisproblem, bei dem ich trotz Recherche nicht zu einem Ergebnis gekommen bin und hoffe, dass mir vielleicht jemand Klarheit verschaffen kann.
    Aufgabenstellung ist in Grob: Erstelle Klasse, füge Regula-Falsi für (noch) unbestimmte Funktion f hinzu und löse diese mit einer friend-Funktion.
    1. Inwiefern soll ich eine allgemeine Formel mittels friend-Funktion "lösen"?
    2. Warum sollte man überhaupt eine Friend-Funktion verwenden falls ich die Formel in den Public-Teil schreibe?

    Aufgabenstellung ist folgende (mir geht es in dieser Frage nur um (iii), wir nehmen an alles andere hätte ich schon programmiert):

    *Die Klasse Nullstelle soll einen Zeiger auf eine Funktion f, zwei Variable vom Typ double für die Intervallränder a und b eines abgeschlossenen Intervalls [a, b] in dem nach einer Nullstelle von f gesucht wird, sowie eine Genauigkeitsschranke epsilon und eine maximale Anzahl von Iterationen imax für die Nullstellensuche als Membervariablen haben.
    (i) Man implementiere den Konstruktor sowie geeignete set- und get-Methoden zur Erzeugung und Initialisierung von Objekten der Klasse sowie zum Zugriff auf deren Membervariablen.
    (ii) Man ergänze die Klasse um eine Memberfunktion, die für eine gegebene Funktion f die Bedingung f(a) · f(b) < 0 überprüft und im positiven Fall eine Nullstelle nach folgender Vorschrift (Regula falsi) annähert:
    setze c = a - ((a - b)/(f(a) - f(b)))*f(a)
    f(a)-f(b)
    setze i = 0
    wiederhole solange |b - a| > epsilon und f(c)/= 0 und i < imax
    falls (f(a) · f(c) < 0)
    ersetze b durch c
    sonst
    ersetze a durch c
    setze c = a - ((a - b)/(f(a) - f(b)))f(a)
    f(a)-f(b)
    erhöhe i = i + 1
    Ist f(a) · f(b) = 0 so soll entweder a oder b als Nullstelle gefunden werden. Im Fall f(a) · f(b) > 0 soll die Berechnung ausgesetzt werden und eine entsprechende Meldung am Bildschirm ausgegeben
    werden.
    (iii) Man löse die Aufgabe (ii) unter Verwendung einer friend-Funktion.

    Ist jemand so freundlich mir zu sagen, was man in (iii) machen soll?


  • Mod

    In (iii) sollst du die Aufgabe (ii) noch einmal wiederholen, aber dieses Mal eben als freie Funktion, die ein Objekt deiner Klasse benutzt, nicht als Memberfunktion. Und aus irgendwelchen Gründen soll diese Funktion ein Friend der Klasse sein, obwohl dies eigentlich eine gute Gelegenheit wäre, die ganzen unnötigen Getter und Setter aus (i) zu benutzen.

    Die Aufgabenstellung wird mit jedem Thread, in dem du mehr davon enthüllst, immer bizarrer.



  • SeppJ schrieb:

    In (iii) sollst du die Aufgabe (ii) noch einmal wiederholen, aber dieses Mal eben als freie Funktion, die ein Objekt deiner Klasse benutzt, nicht als Memberfunktion. Und aus irgendwelchen Gründen soll diese Funktion ein Friend der Klasse sein, obwohl dies eigentlich eine gute Gelegenheit wäre, die ganzen unnötigen Getter und Setter aus (i) zu benutzen.

    Also so gesehen gleiches Programm nur als Friend-Funktion? Wo genau ist da der Unterschied zu wenn ich es in der Klasse definiere? (Außer dass es halt ein "friend-" davor hat)

    SeppJ schrieb:

    Die Aufgabenstellung wird mit jedem Thread, in dem du mehr davon enthüllst, immer bizarrer.

    Zumindest wird es nicht mehr viel bizarrer! 🙂 Im letzten Teil der Aufgabe soll ich meine Klasse an einem Rechenbeispiel testen. Danach geht es wohl noch weiter, aber mehr wurde mir nicht zugeteilt, wer weiß was da sonst noch so gekommen wäre 😃


  • Mod

    Mikomi schrieb:

    SeppJ schrieb:

    In (iii) sollst du die Aufgabe (ii) noch einmal wiederholen, aber dieses Mal eben als freie Funktion, die ein Objekt deiner Klasse benutzt, nicht als Memberfunktion. Und aus irgendwelchen Gründen soll diese Funktion ein Friend der Klasse sein, obwohl dies eigentlich eine gute Gelegenheit wäre, die ganzen unnötigen Getter und Setter aus (i) zu benutzen.

    Also so gesehen gleiches Programm nur als Friend-Funktion? Wo genau ist da der Unterschied zu wenn ich es in der Klasse definiere? (Außer dass es halt ein "friend-" davor hat)

    Probier's doch aus. Du wirst sehen, es gibt Unterschiede.



  • Wenn ich die Regula-Falsi Funktion mit "friend"-betitle, krieg ich 27 Fehlermeldungen 😃
    So ziemlich alle lassen sich auf mein double (*f) double zurückführen mit der Bezeichnung "invalid use of the non-static data member Nullstelle::f".
    Was heißt das? Beziehungsweise was muss/kann ich tun um das zu korrigieren?

    Okay, ich hab es "einfach" dadurch korrigiert indem ich static vor double (*f) double gesetzt habe. Das kann aber nicht der Sinn dieser Aufgabe sein, oder?


  • Mod

    Mikomi schrieb:

    Okay, ich hab es "einfach" dadurch korrigiert indem ich static vor double (*f) double gesetzt habe. Das kann aber nicht der Sinn dieser Aufgabe sein, oder?

    Nein, das ist nicht der Sinn der Aufgabe. Der Sinn der Aufgabe ist, dass du den Unterschied kapierst. Daher werde ich es auch nicht vor sagen. Der erste Schritt wäre offensichtlicherweise, dass du erst einmal verstehst, dass es da überhaupt einen Unterschied gibt.



  • Okay, dann weiß ich schonmal zumindest, dass das nicht Sinn der Sache war. Ich setze mich noch einmal an die Sache und versuche zu verstehen was genau das alles zu bedeuten hat.

    Edit: Also. Man hat private Daten in einer Klasse und eine Funktion in der Klasse, die man mit "friend"- betiteln kann (aber noch nicht ausformuliert ist). Die gleichnamige Funktion kann dann außerhalb der Klasse formuliert werden, hat aber immernoch Zugriff auf die private Daten der Klasse. Ist dieser Denkansatz korrekt oder habe ich das friend-Prinzip falsch verstanden?


  • Mod

    Das wichtige an einer Friend-Funktion ist, dass sie Zugriff auf private und protected Daten hat. Was dir nicht klar zu sein scheint, sind die Begriffe "Klasse" und "Objekt". Was nicht weiter verwunderlich ist, bei dieser Aufgabenstellung.



  • Von den Begriffen "Klasse" und "Objekt" hab ich in der Tat nur theoretisch eine Ahnung...
    Sowie ich das verstanden habe ist eine Klasse nichts wirklich programmiertes oder "festes", sondern definiert lediglich so etwas wie eine Art "Idee" eines tatsächlichen Objektes, welches dann mittels Klasse erst in einer main () Funktion realisiert wird. Ein Objekt... was genau damit gemeint ist fällt mir etwas schwer nachzuvollziehen, aber so wie ich das verstanden habe ist ein Objekt das am Ende erzeugte Programmierprojekt (z.B. eine ausformulierte Formel die z.B. eine Nullstelle ausgibt).

    Vermutlich liege ich mit meinen Deutungen der Begriffe ziemlich daneben, allerdings fällt es einem Einsteiger ohne Vorkenntnisse und Lehrveranstaltung wirklich schwer sich das mittels Google Ergebnissen und einem meiner Meinung nach recht dürftigen "Grundkurs C++" Kurses recht schwer sich diese Dinge selbst bei zu bringen, also bitte nicht zu hart zu einem totalen Anfänger sein 😕



  • Mikomi schrieb:

    Edit: Also. Man hat private Daten in einer Klasse und eine Funktion in der Klasse, die man mit "friend"- betiteln kann (aber noch nicht ausformuliert ist). Die gleichnamige Funktion kann dann außerhalb der Klasse formuliert werden, hat aber immernoch Zugriff auf die private Daten der Klasse. Ist dieser Denkansatz korrekt oder habe ich das friend-Prinzip falsch verstanden?

    Eine friend Deklaration sagt dem Compiler nur: "es gibt eine freie Funktion Namens somefriend(...), welche Zugriff auf private Member dieser Klasse hat".

    Minimalbeispiel:

    class foo
    {
        int private_int;
    
        friend void somefriend(foo& object);
    };
    
    void somefriend(foo& object)
    {
        object.private_int = 1234;
    }
    
    int main()
    {
        foo x; // x ist das Objekt in Form von Speicherplatz
    
        somefriend(x);
    
        return 0;
    }
    

    Es gibt auch "friend class someclass" wobei alle Member-Funktionen von someclass Zugriff auf private Member (von foo) erhalten.



  • osdt schrieb:

    Eine friend Deklaration sagt dem Compiler nur: "es gibt eine freie Funktion Namens somefriend(...), welche Zugriff auf private Member dieser Klasse hat".

    Es gibt auch "friend class someclass" wobei alle Member-Funktionen von someclass Zugriff auf private Member (von foo) erhalten.

    Danke für die Erklärung osdt 🙂 Ich denke, ich verstehe es durch dein Beispiel um einiges besser und werde es mir nochmal genauer anschauen um daraus zu lernen 👍


Log in to reply