Frage zu "Friend"



  • Hallo Liebe Community,

    Ich hätte eine Frage zu dem Schlüsselwort "Friend", wenn man einer Funktion ermöglichen will Zugriff auf privat zu bekommen.

    Klasse lautet wie folgt :

    class BankAccount {
    private:
        float Balance;
    public:
        void SetBalance(float b);
        float GetBalance();
        void Depositing(float d);
        void Withdrawing(float w);
        void Info();
        BankAccount();
        friend float totalBalance();
    };
    

    und den Aufruf und die Main

    float totalBalance(BankAccount &s){
    return s.Balance;
    }
    
    int main () {
    
    BankAccount kunde;
    BankAccount kunde2;
    BankAccount kunde3;
    
    cout << totalBalance(kunde) << endl;
    
    return 0;
    }
    

    Als Fehlermeldung kommt, dass kein Zugriff möglich ist da "Balance" private ist.
    Ich weiß, dass das Schlüsselwort Friend nicht optimal ist aber naja, muss ich nunmal lernen.

    Freue mich auf jede Antwort.



  • Die Signatur von totalBalance in der friend-Deklaration passt nicht zur Funktion selbst.



  • Vergleiche mal die Funktionssignatur bei der Deklaration (also wo dein friend steht) und der Definition. Fällt dir was auf? Tipp: Der Compiler sieht zwei verschieden Funktionen (Überladungen) von totalBalance. Eine ist definiert, die andere nicht.



  • Die Parameter sind unterschiedlich.



  • Vielen herzlichen Dank. Wie konnte ich das übersehen.

    Eine weitere Frage.
    Ich habe 3 Kunden angelegt von denen jeder einen Kontostand hat (Konstruktor).

    Ich könnte jetzt natürlich

    cout << totalBalance(kunde)+totalBalance(kunde2)+totalBalance(kunde3) << endl;
    

    machen und er addiert mir die Kontostände von den Kunden zusammen.
    Gibt es da jedoch eine elegantere Lösung ?



  • Da du die Kunden als einzelne Instanzen gespeichert hast nicht.
    Mit einer Datenstruktur schon:

    std::array<BankAccount, 3> Accounts;
    
    std::cout << std::accumulate(Accounts.begin(), Accounts.end(), 0.f, [](float V, BankAccount const& Acc) { return V + totalBalance(Acc); });
    

    Ausserdem sollte totalBalance eine Referenz auf const annehmen, denn du veränderst das Objekt beim Auslesen ja nicht.



  • Wie wäre es mit einem statischen Klassen-Attribut totalBalance und einer statischen Memberfunktion getTotalBalance

    class BankAccount {
    private:
        float Balance;
        static float totalBalance;
    public:
        void SetBalance(float b);  // hier muss du dann natürlich auch totalBalance anpassen
        float GetBalance();
        void Depositing(float d);
        void Withdrawing(float w);
        void Info();
        BankAccount();
        static float getTotalBalance() {return totalBalance;}
    };
    

Anmelden zum Antworten