Funktion im Hauptprogramm, die auf private Member der Klasse zugreifen kann
-
Dies soll ausdrücklich eine Funktion sein und keine Methode der Klasse um das Verständnis zu fördern. Die Methode wäre ja über testkonto.drucke_kontoauszug(); mit passender implementierung, das hat geklappt, wie aber geht das mit einer Funktion. Hier die exakte Teil-Aufgabe:
Erstellen Sie eine Funktion void drucke_kontoauszug(??) und eine Methode
void CKonto::drucke_kontoauszug(??).
Welche Möglichkeiten gibt es, der Funktion Zugriff auf private Attribute
zu verschaffen?
Was sind Gemeinsamkeiten und was Unterschiede der beiden Lösungen?
-
muschelfinder schrieb:
Dies soll ausdrücklich eine Funktion sein und keine Methode der Klasse um das Verständnis zu fördern.
Meines Erachtens fördern solche Designbrüche aber nicht das Verständnis.
friendsollte eigentlich nur sehr sehr selten vorkommen.Von daher würde ich, wenn ich von aussen zugreifen wollte, entsprechende Get-Methoden in der Klasse bereitstellen. So muss man nicht mehr direkt auf private Member zugreifen, sondern hat gekapselten Zugriff, was sowieso sinnvoll ist.
Also sowas:
float CKonto::gib_kontostand() const { return fKtoStand; } void drucke_kontoauszug(/* was könnte hier stehen? */) { // verwende gib_kontostand() und noch zu implementierendes // gib_kontonummer(), um auf die Klasse zuzugreifen. }
-
Ich bin noch ganz am Anfang von C++ und checke die Zusammehänge irgendwie nicht. Eine Ausgabe habe ich ja schon einmal hinbekommen. Aber da sagte der Prof. wir sollen es um den Unterschied zu sehen per Funktion im Hauptprogramm machen.
So bekomme ich den Kontoauszug ausgegeben, was will der Prof nun genau sehen?
////////////////////Kontoverwaltung.cpp//////////////////// #include <stdio.h> #include <iostream> #include <conio.h> #include "Konto.h" using namespace std; int zahl; float _Betrag; int main() { CKonto testkonto(123123, 5.0); weiter: do { cout << "Kontoverwaltung" << endl; cout << "Ihr Kontostand betraegt: "; testkonto.kontostand_lesen(); cout << "1: Kontostand lesen" << endl; cout << "2: einzahlen" << endl; cout << "3: auszahlen" << endl; cout << "4: Kontoauszug drucken" << endl; cout << "0: Ende" << endl; cin >> zahl; switch(zahl) { case 1: cout << "Kontostand lesen" << endl; break; case 2: cout << "einzahlen" << endl; cin >> _Betrag; testkonto.einzahlen(_Betrag); break; case 3: cout << "auszahlen" << endl; cin >> _Betrag; testkonto.auszahlen(_Betrag); break; case 4: cout << "Kontoauszug drucken:" << endl; testkonto.drucke_kontoauszug(); case 5: cout << "Ende" << endl; break; } }while(zahl != 0); _getch(); } ////////////////////Konto.cpp//////////////////// #include "Konto.h" #include <iostream> using namespace std; CKonto::CKonto(void) { } CKonto::~CKonto(void) { } CKonto::CKonto(int _KtoNr, float _KtoStand) { fKtoStand = 0; iKtoNr = _KtoNr; fKtoStand = _KtoStand; } void CKonto::kontostand_lesen() { cout << fKtoStand << " Euro" << endl; } void CKonto::einzahlen(float _Betrag) { fKtoStand+=_Betrag; } void CKonto::auszahlen(float _Betrag) { if(_Betrag > fKtoStand) cout << "Nicht moeglich, Limit erreicht!\n" << endl; else { fKtoStand-=_Betrag; } } void CKonto::drucke_kontoauszug() { cout << "\nDatum: 15.04.2009" << "\n" << "Kontonummer:" << iKtoNr << "\n" << "Kontostand:" << fKtoStand << "\n" << endl; } ////////////////////Konto.h//////////////////// #ifndef KONTO_H #define KONTO_H #pragma once class CKonto { public: CKonto(void); ~CKonto(void); CKonto(int, float); void kontostand_lesen(); void einzahlen(float _Betrag); void auszahlen(float _Betrag); void drucke_kontoauszug(); private: float fKtoStand; int iKtoNr; }; #endif
-
muschelfinder schrieb:
Dies soll ausdrücklich eine Funktion sein und keine Methode der Klasse um das Verständnis zu fördern. Die Methode wäre ja über testkonto.drucke_kontoauszug(); mit passender implementierung, das hat geklappt, wie aber geht das mit einer Funktion. Hier die exakte Teil-Aufgabe:
Erstellen Sie eine Funktion void drucke_kontoauszug(??) und eine Methode
void CKonto::drucke_kontoauszug(??).
Welche Möglichkeiten gibt es, der Funktion Zugriff auf private Attribute
zu verschaffen?
Was sind Gemeinsamkeiten und was Unterschiede der beiden Lösungen?Wenn du eh schon eine Memberfunktion drucke_kontoauszug() hast, kannst du in der globalen Funktion ja diese aufrufen.
-
Hi,
vielen Dank!So wie ich es jetzt in meinem letzten Beitrag habe, meinte der Prof., dass es so nicht gedacht gewesen sei. Ich check aber nicht wie ich es anders machen soll. Was meint er denn in der Aufgabenstellung? Irgendwas mit friend meine ich hätte er erwähnt.
Besten Dank!
-
http://www.c-plusplus.net/forum/viewtopic-var-t-is-238604-and-highlight-is-.html
Dein Prof. sollte sich echt Gedanken machen, ob er an der richtigen Stelle seine Arbeit tut.
Simon
-
Ja gut, er will uns wohl die Zusammenhänge näher bringen.
Wer kann mir denn nun etwas zu der Aufgabe selbst sagen. Versteht jemand, was er genau möchte? Es soll ja nicht so sein wie ich es gemacht habe!?
-
muschelfinder schrieb:
Ja gut, er will uns wohl die Zusammenhänge näher bringen.
Inem er euch den ganzen Scheiß machen lässt den man möglichst vermeiden sollte? Didaktisch absolute Katastrophe.
-
pumuckl schrieb:
muschelfinder schrieb:
Ja gut, er will uns wohl die Zusammenhänge näher bringen.
Inem er euch den ganzen Scheiß machen lässt den man möglichst vermeiden sollte? Didaktisch absolute Katastrophe.
finde ich nicht.
-
volkard schrieb:
pumuckl schrieb:
muschelfinder schrieb:
Ja gut, er will uns wohl die Zusammenhänge näher bringen.
Inem er euch den ganzen Scheiß machen lässt den man möglichst vermeiden sollte? Didaktisch absolute Katastrophe.
finde ich nicht.
und wieso nicht?
-
Besten Dank für die vielen Meinungen. Konkrete Hilfe würde mir aber mehr weiter helfen.
Ich denke er mein es so, dass ich eine Funktion in Kontoverwaltung.cpp deklarieren soll und diese in der Konto.h mit friend deklariere.
also etwa so:
//Kontoverwaltung.cpp ..... void drucke_kontoauszug() { cout << iKtoNr; } //Konto.h friend void drucke_kontoauszug()
-
Das friend muss in die Klassendeklaration
class CKonto { friend void drucke_kontoauszug() public: //.. private: //.. };Gleichzeitig solltest du dir überlegen woher deine Funktion drucke_kontoauszug() weiß von welchem Objekt es die Daten ausdrucken soll. Die Funktion bräuchte daher in meinen Augen noch einen Parameter.

-
Mitleid schrieb:
Die Funktion bräuchte daher in meinen Augen noch einen Parameter.

und nen semikolon nach den klammern brauch sie auch noch

-
Das wäre die Lösung gewesen:
////////////////////Kontoverwaltung.cpp//////////////////// #include <iostream> #include <conio.h> #include "Konto.h" using namespace std; int zahl; float _Betrag; int main() { CKonto testkonto(123123, 5.0); weiter: do { cout << "Kontoverwaltung" << endl; cout << "Ihr Kontostand betraegt: "; testkonto.kontostand_lesen(); cout << "1: Kontostand lesen" << endl; cout << "2: einzahlen" << endl; cout << "3: auszahlen" << endl; cout << "4: Kontoauszug drucken" << endl; cout << "0: Ende" << endl; cin >> zahl; switch(zahl) { case 1: cout << "Kontostand lesen" << endl; break; case 2: cout << "einzahlen" << endl; cin >> _Betrag; testkonto.einzahlen(_Betrag); break; case 3: cout << "auszahlen" << endl; cin >> _Betrag; testkonto.auszahlen(_Betrag); break; case 4: cout << "Kontoauszug drucken:" << endl; drucke_kontoauszug(testkonto); break; case 5: cout << "Ende" << endl; break; } }while(zahl != 0); _getch(); } ////////////////////Konto.cpp//////////////////// #include "Konto.h" #include <iostream> using namespace std; CKonto::CKonto(void) { } CKonto::~CKonto(void) { } CKonto::CKonto(int _KtoNr, float _KtoStand) { fKtoStand = 0; iKtoNr = _KtoNr; fKtoStand = _KtoStand; } void CKonto::kontostand_lesen() { cout << fKtoStand << " Euro" << endl; } void CKonto::einzahlen(float _Betrag) { fKtoStand+=_Betrag; } void CKonto::auszahlen(float _Betrag) { if(_Betrag > fKtoStand) cout << "Nicht moeglich, Limit erreicht!\n" << endl; else { fKtoStand-=_Betrag; } } void drucke_kontoauszug(CKonto ¶m_konto) { cout << "\nDatum: 20.04.2009"; cout << "\n" << "Kto. Nr.:" << param_konto.iKtoNr; cout << "\n" << "Kontostand:" << param_konto.fKtoStand << endl << endl; } ////////////////////Konto.h//////////////////// #ifndef KONTO_H #define KONTO_H #pragma once class CKonto { public: CKonto(void); ~CKonto(void); CKonto(int, float); void kontostand_lesen(); void einzahlen(float _Betrag); void auszahlen(float _Betrag); friend void drucke_kontoauszug(CKonto ¶m_konto); private: float fKtoStand; int iKtoNr; }; #endif
-
Die globalen Variablen in der Main müssen nicht sein, pack das mit in die Main rein.Und ich hoffe das "weiter:" vor deinem "do-while" ist nur noch ein überbleibsel von einem goto, verwende bitte sowas nie wieder

-
volkard schrieb:
pumuckl schrieb:
muschelfinder schrieb:
Ja gut, er will uns wohl die Zusammenhänge näher bringen.
Inem er euch den ganzen Scheiß machen lässt den man möglichst vermeiden sollte? Didaktisch absolute Katastrophe.
finde ich nicht.
Und warum nicht? Der Prof konstruiert halbseidene Beispiele die mit friends gelöst werden sollen, obwohl es Alternativen gibt. Sein Ziel ist zwar, die Verwendung von friends beizubringen, aber was er damit vor allem beibringt ist "wenn du einen Hack brauchst nimm einfach friend". friend ist die stärkste Abhängigkeit die es in C++ gibt, und daher sollte man die Nutzung von friends nach Möglichkeit vermeiden. Die Aufgabenstellung des Profs "es geht auch anders, aber nimm auf jeden Fall friend" untergräbt das, wenn auch vielleicht unbeabsichtigt. Deshalb didaktisch ziemlicher Müll. Wenn er ein Beispiel genommen hätte was tatsächlich nur mit friends zu regeln gewesen wäre, kein Problem.
Beim vorliegenden Beispiel wäre es sehr viel klüger gewesen, die friend-Lösung vorzugeben und als Aufgabe zu schreiben "Finden Sie eine Alternative um die friend-Deklaration zu vermeiden". Damit hat der Student zum Einen ein Beispiel wie eine friend-Deklaration aussehen kann, zum Anderen lernt er das wichtigste bei friends - nämlich sie zu vermeiden.