Hallo Leute!
Ich mache zur Zeit ein Fernstudium, habe eine Aufgabe, dessen Quelltext
Fehler beinhaltet.
Ich schicke euch hiermit mal den Quelltext, weitestgehend von mir
abgeändert, wo ich Fehler gefunden habe.
Diese sind mit einem Kommentar beschrieben.
Hier der Code:
Hallo,
das könnte daran liegen, dass rechne_gesamt() erst nach main(), in der
Du sie benutzt deklariert wird. Also vor main() einen Prototypen
platzieren:
float rechne_gesamt(Haendler h, Frau f);
Du könntest auch die ganze rechne_gesamt() vor main() platzieren, ich
würde aber die Version mit dem Prototypen bevorzugen.
Viele Grüße
Alfred
Du deklarierst in beiden Klassen eine Funktion rechne_gesamt, aber
implementierst keine davon.
Das ist aber gar nicht erforderlich, ebensowenig das friend und auch
nicht die Vorwärtsdeklaration.
Das einzige, das Dir fehlt, ist der klassenlose Prototyp von
"rechne_gesamt", wie Alfred schon riet.
Damit ergibt sich folgendes:
1
classHaendler
2
{
3
public:
4
floatpreis[4];
5
voidsetze_preis(inti,floatp){preis[i]=p;};
6
voidzeige_preise()
7
{
8
printf(" %7.2f I%7.2f I%7.2f I%7.2f I",
9
preis[0],preis[1],preis[2],preis[3]);
10
}
11
//float gib_preis(int i) { return preis[i];};
12
};
13
14
15
classFrau
16
{
17
18
public:
19
floatmenge[4];//!! Muss public sein
20
voidsetze_menge(inti,floatm){menge[i]=m;};
21
voidzeige_mengen()
22
{
23
printf(" %7.2f I%7.2f I%7.2f I%7.2f I",
24
menge[0],menge[1],menge[2],menge[3]);
25
}
26
//float gib_menge(int i) { return menge[i];};
27
};
28
29
30
31
// Funktionsprototyp
32
floatrechne_gesamt(Haendlerh,Frauf);
33
34
35
intmain(void)
36
{
37
// etc.
38
}
39
40
41
floatrechne_gesamt(Haendlerh,Frauf)
42
{
43
// etc.
44
}
Das ist natürlich aus der Sicht der Objektorientierung ziemlicher
Schrunz, in rechne_gesamt greifst Du direkt auf Member der beiden
Klassen zu, was ein no-go sein sollte. Auch ist das Wissen, daß die
Member-Arrays beider Klassen ausgerechnet vier Elemente enthalten, hier
fest codiert.
Wenn Du bei der Aufgbabe auch etwas lernen möchtest, solltest Du
vielleicht mal unter dem Stichwort "Datenkapselung" nachlesen.
Einige Deiner Änderungen erscheinen sind unter diesem Gesichtspunkt
nicht sinnvoll, dafür fehlt eine entscheidende Änderung in
"rechne_gesamt".
Einen Blick wert wären auch die Formatspezifizierungen bei "printf".
Soweit mal auf die Schnelle...
Die globale Funktion rechne_gesamt() ist ziemlich krank, aber
wahrscheinlich so vorgegeben.
Zumindest würde ich es so schreiben:
1
floatrechne_gesamt(constHaendler&h,constFrau&f)
2
{
3
...
Damit es wenigstens übersetzbar ist, muß zudem erstens in beiden Klassen
die Funktion als friend deklarieert werden (ist beim OP nur in
Haendler).
Also mit meinem Vorschlag von oben in beiden Klassen so:
Rufus t. Firefly schrieb:> Das ist aber gar nicht erforderlich, ebensowenig das friend und auch> nicht die Vorwärtsdeklaration.
Solange alles public ist, ist das friend tatsächlich überflüssig.
Aber besser wäre es, die Daten der Klassen private oder protected zu
machen, dann ist das friend wieder nötig.
der_lebende schrieb:> Ich mache zur Zeit ein Fernstudium, habe eine Aufgabe, dessen Quelltext> Fehler beinhaltet.
Musst du nur syntaktische Fehler finden, oder auch Design und
Logikfehler?
(die Funktion rechen_gesamt rechnet falsch. Sie berücksichtigt nicht,
dass die Kunden die Produkte nicht in derselben Reihenfolge einkaufen,
in der sie die Händler führen)
Habe es jetzt so abgeändert, es bestehen trotzdem weiterhin 2 Fehler,
einmal der Vorherige (externes Symbol ...) und "fatal error LNK1120: 1
nicht aufgelöste externe Verweise".
Hier der bis dato abgeänderte Code:
Klaus Wachtler schrieb:> Rufus t. Firefly schrieb:>> Das ist aber gar nicht erforderlich, ebensowenig das friend und auch>> nicht die Vorwärtsdeklaration.>> Solange alles public ist, ist das friend tatsächlich überflüssig.> Aber besser wäre es, die Daten der Klassen private oder protected zu> machen, dann ist das friend wieder nötig.
Kann man streiten.
Grundsätzlich sollte ja niemand von ausserhalb einer Klasse direkt auf
die Member einer Klasse zugreifen, sondern immer über Zugriffsfunktionen
gehen.
Dann ist das friend wieder nicht nötig.
friend sollte man, wenn überhaupt, nur dann benutzen, wenn zwei Klassen
in wirklich enger und inniger Beziehung zueinander stehen. Ob das bei
einem Händler und seinen Kunden der Fall ist, darf bezweifelt werden.
der_lebende schrieb:> Habe es jetzt so abgeändert, es bestehen trotzdem weiterhin 2 Fehler,> einmal der Vorherige (externes Symbol ...) und "fatal error LNK1120: 1> nicht aufgelöste externe Verweise".
Du vereinbarst hier
> friend float rechne_gesamt(Haendler &h, Frau &f);
und hier
> friend float rechne_gesamt(Haendler &h, Frau &f);
das es eine Funktion rechne_gesamt gibt.
Für diese Funktion hast du sogar einen Prototypen
> float rechne_gesamt(Haendler &h, Frau &f);
Aber du hast die Funktion selber nicht!
Das hier ist sie nicht. Vergleich mal die Argumenttypen
> /*********************************************************************** ***/> float rechne_gesamt(Haendler h, Frau f)> {> int i;> float gesamt=0.0;>> for (i=0; i<4; i++)> gesamt += h.preis[i] * f.menge[i];>> return gesamt;> }> /*********************************************************************** ***/
Karl heinz Buchegger schrieb:> (die Funktion rechen_gesamt rechnet falsch. Sie berücksichtigt nicht,> dass die Kunden die Produkte nicht in derselben Reihenfolge einkaufen,> in der sie die Händler führen)
Zieh ich zurück.
Das wird tatsächlich dadurch gelöst, wie Frauen ihren Einkauf speichern.
Schön ist es nicht - es verallgemeinert schlecht. Wenn Händler
unterschiedliche Produkte anbieten von denen die Frau nur einige und
nicht alle kauft, bricht alles zusammen.
Aber im konkreten Fall kommt das richtige heraus.
Mark Brandis schrieb:> Gah. Immer dieses Gemixe von C und C++ :-(>> Dabei ist die Bildschirmausgabe mit cout doch nun sooo schwer auch> wieder nicht:
Genau.
Karl heinz Buchegger schrieb:> Grundsätzlich sollte ja niemand von ausserhalb einer Klasse direkt auf> die Member einer Klasse zugreifen, sondern immer über Zugriffsfunktionen> gehen.>> Dann ist das friend wieder nicht nötig.
Da gebe ich dir vollkommen recht.
Nur scheint es mir hier vorgegeben, und ich weiß nicht,
wie weit man daraus jetzt ein sinnvolles Programm machen soll.
Karl heinz Buchegger schrieb:> Zieh ich zurück.> Das wird tatsächlich dadurch gelöst, wie Frauen ihren Einkauf speichern.
Männer werden nie verstehen, wie das mit Frauen und Einkauf
funktioniert.
Karl heinz Buchegger schrieb:> Für diese Funktion hast du sogar einen Prototypen>>> float rechne_gesamt(Haendler &h, Frau &f);
Zudem:
Kein echter Fehler, aber eine Schlamperei sind bei den
Referenzen die fehlenden const (siehe oben).
> ist ja auch deutlich einfacher
Kein normaler Mensch schreibt hunderttausendmal pro Datei std::cout,
std::endl usw. - dafür gibt's ja using std::cout etc. :-)
Mark Brandis schrieb:> Kein normaler Mensch schreibt hunderttausendmal pro Datei std::cout,> std::endl usw. - dafür gibt's ja using std::cout etc. :-)
Vielleicht bin ich ja nicht normal, aber ich schreibe das aus.
Bzw. lasse es vom Editor ausschreiben.
using nehme ich so gut wie nie.
Genau genommen gar nicht.