Klasse beinhaltet Objekte einer anderen Klasse, wie?
-
unskilled schrieb:
mein nächstes Problem ist, das ich in der Klasse bruch einen Konstruktor bauen will, dem ich ein Objekt der Klasse komrad übergeben kann, und er sich dann den Realteil herrauszieht.
Versteh ich nicht - du willst also nicht das gesamte Objekt kopieren, sondern nur den Realteil?
Falls ich das richtig verstanden habe, wäre hier der Kopierkonstruktor nicht geeignet und du solltest ne eigene Funktion dafür schreiben, da der Kopierkonstruktor dazu da ist, das gesamte Objekt zu kopieren...bb
Ein Konstruktor von bruch der ein komrad als Argument nimmt hat auch nichts mit einem Kopierkonstruktor zu tun...
folgende Möglichkeiten gibts bei der Bruch-Klasse die du oben beschrieben hast:
bruch(komrad const& kom) { set(kom.getRe().zaehler, kom.getRe().nenner); } //Variante1 mit direktem Aufruf von set bruch(komrad const& kom) { *this = bruch(kom.getRe()); } //Variante2 mit Aufruf des Kopierkonstruktors von bruch, also indirekter Aufruf von set bruch(komrad const& kom) : zaehler(kom.getRe().zaehler), nenner(kom.getRe().nenner) {} //Variante3 mit InitialisierungslisteAllerdings brauchen alle drei versionen Zugriff auf den Realteil von komrad, daher sollte die Klasse komrad entweder eine Funktion wie getRe() definieren die den Realteil zurückgibt, oder sie sollte den Konstruktor von bruch zum Friend machen.
-
von bruch auf komrad hab ich das so gelöst:
class komrad { private: bruch re, im; public: komrad (int zre, int nre, int zim, int nim) : re (zre, nre), im (zim, nim) {} komrad (bruch const & kre, bruch const & kim) : re (kre), im(kim) {} //hier die wichtige Zeile: wenn die klasse komrad nen bruch bekommt, initialisiert sie re mit dem bruch, und im wird mit (0,0) initialisiert. komrad (bruch const & kre) :re (kre), im(0,0) {}damit kann ich entweder einer komrad einen bruch zuweisen oder komrad mit einem bruch initialisieren:
// in der main dann: bruch b1=bruch(1,2); bruch b2=bruch(3,4); bruch b3=bruch(4,5); komrad brueche_uebergeben=komrad(b1, b2); brueche_uebergeben.display(); komrad bruch_uebergeben=komrad(b3); bruch_uebergeben.display(); a=b1; a.display();was zu folgender Ausgabe führt:
brueche_uebergeben: 1/2+3/4i
bruch_uebergeben: 4/5+0/0ia.display: 1/2+0/0i
das geleiche soll jetzt auch für bruch möglich sein, dem ein komrad gegeben wird.
-
die get-funktionen hab ich:
public: [...] hier stehen die konstruktoren int get_imzaehler () { int a=0; return a=im.get_zaehler(); } int get_imnenner () { int a=0; return a=im.get_nenner(); } int get_rezaehler () { int a=0; return a=re.get_zaehler(); } int get_renenner () { int a=0; return a=re.get_nenner(); } bruch get_re () { return re;} bruch get_im () { return im;}ok, sind vielleicht umständlich, aber sie funktionieren (glaub ich ^^)
edit: get_re und get.im hinzugefügt....es bleibt aber immernoch bestehen, das ich folgende Fehler bekomme:
Fehler 1 error C2027: Verwendung des undefinierten Typs "komrad"
Fehler 2 error C2228: Links von ".get_re" muss sich eine Klasse/Struktur/Union befinden.
-
Ich habe jetzt alle 3 von Pumuckl vorgeschlagenen Varianten ausprobiert, doch bei jeder erhalte ich folgende Fehler:
ich habe die Klasse komrad vorrangestellt, weiter unten iss der Anfang meines Codes.Variante 1:
bruch(komrad const& kom) { set(kom.getRe().zaehler, kom.getRe().nenner); } //Variante1 mit direktem Aufruf von setFehler 1 error C2027: Verwendung des undefinierten Typs "komrad"
Fehler 2 error C2228: Links von ".get_re" muss sich eine Klasse/Struktur/Union befinden.
Fehler 3 error C2228: Links von ".zaehler" muss sich eine Klasse/Struktur/Union befinden.
Fehler 4 error C2027: Verwendung des undefinierten Typs "komrad"
Fehler 5 error C2228: Links von ".get_re" muss sich eine Klasse/Struktur/Union befinden.
Fehler 6 error C2228: Links von ".nenner" muss sich eine Klasse/Struktur/Union befinden.Variante 2:
bruch(komrad const& kom) { *this = bruch(kom.getRe()); } //Variante2 mit Aufruf des Kopierkonstruktors von bruch, also indirekter Aufruf von setFehler 1 error C2027: Verwendung des undefinierten Typs "komrad"
Fehler 2 error C2228: Links von ".get_re" muss sich eine Klasse/Struktur/Union befinden.Variante 3:
bruch(komrad const& kom) : zaehler(kom.get_re().zaehler), nenner(kom.get_re().nenner) {}Fehler 1 error C2027: Verwendung des undefinierten Typs "komrad"
Fehler 2 error C2228: Links von ".get_re" muss sich eine Klasse/Struktur/Union befinden.
Fehler 3 error C2228: Links von ".zaehler" muss sich eine Klasse/Struktur/Union befinden.
Fehler 4 error C2027: Verwendung des undefinierten Typs "komrad"
Fehler 5 error C2228: Links von ".get_re" muss sich eine Klasse/Struktur/Union befinden.
Fehler 6 error C2228: Links von ".nenner" muss sich eine Klasse/Struktur/Union befinden.so sieht derzeit der Anfang meines Codes aus:
#include <iostream> using namespace std; class komrad; class bruch { private: int zaehler, nenner; public: bruch (int z,int n) {set (z, n);} bruch (int zaehler) {int nenner=1; set(nenner, zaehler);} bruch (const bruch& a) {zaehler=a.zaehler; nenner=a.nenner;} // eigener Versuch: //bruch (komrad blubb) //{ // int hilfszaehler=0, hilfsnenner=0; // hilfszaehler=blubb.get_rezaehler(); // hilfsnenner=blubb.get_renenner(); // set(hilfszaehler, hilfsnenner); //} //bruch(komrad const& kom) { set(kom.get_re().zaehler, kom.get_re().nenner); } // Variante 1 //bruch(const komrad& a) { *this = bruch(a.get_re()); } // Variante 2 //bruch(komrad const& kom) : zaehler(kom.get_re().zaehler), nenner(kom.get_re().nenner) {} // Variante 3 ~bruch (){/*cout << "Destructing bruch " << zaehler << "/" << nenner << endl;*/} [...] jede Menge weiterer Zeilen Code ....
-
In der Fehlermeldung steht ja, dass du einen nicht definierten Typ verwendest. Die Klasse
komradmuss hier vollständig bekannt sein, eine Vorwärtsdeklaration reicht nicht.
-
naja, aber irgendwas muss als erstes stehen.
Ich verwende bruch in der klasse komrad, genauso wie ich komrad in der Klasse bruch verwende...
Da beißst sich die Schlange selbst in den Schwanz
schau:
meine Klasse bruch steht ja oben...
und genauso isses auch in der Klasse komrad:[...] // Klasse bruch usw. class komrad { private: bruch re, im; public: komrad (int zre, int nre, int zim, int nim) : re (zre, nre), im (zim, nim) {} komrad (bruch const & kre, bruch const & kim) : re (kre), im(kim) // Aufruf des Kopierkonstruktors... {} //<> Name der Membervariablen (Kein this!) // <> Name des Parameters komrad (bruch const & kre) :re (kre), im(0,0) {} ~komrad(){} [...] // jede Menge Code :)Ich habs ausprobiert, ich hab komrad vor bruch gestellt, nur dann krieg ich die Fehlermeldungen bei komrad, weil bruch net bekannt iss

-
Das ist nicht so gut, wenn sich die beiden Klassen gegenseitig verwenden. Wofür braucht ein Bruch eine komplexe Zahl zu kennen? Ich denke, du willst ja in der komplexen Zahl zwei Brüche (Real- und Imaginärteil) speichern, die ja selber reell sind.
Abgesehen davon teilt man Klassen normalerweise in Schnittstelle (Klassendefinition, Deklaration der Memberfunktionen) und Implementierung (Definition der Memberfunktionen auf). Die Schnittstelle befindet sich in einer Headerdatei (.h/.hpp), die Implementierung in einer kompilierbaren C++-Datei (.cpp).
-
ich hab keine Ahnung was normal iss, und ich hab keine Ahnung, warum grade die komrad 2x bruch beinhalten soll.
Was ich aber weiß iss, das es die Aufgabenstellung des Professors iss.
● Ergänzen Sie zur Typumwandlung Cast-Funktionen (z.B. über
Typumwandlungs-Konstruktoren) von der Klasse KompRat zur Klasse
Bruch und umgekehrt. Bei der Verwandlung zum Bruch wird der
Imaginär-Teil verworfen. Bei der Verwandlung zur „komplexen rationalen
Zahl“ wird der Imaginärteil auf Null initialisiert.
-
Nun will ja schon die Aufgabenstellung, dass du in beiden Klassen einen Copy-Konstruktor für die jeweils andere Klasse hast, wenn ich mir das genau genug durchgelesen habe. Da bleibt nichts anderes, als die Implementierung in ein Modul (eine neue .cpp) auszulagern. Solange in der Deklaration nur die Referenzen verwendet werden, kommst du mit Vorwärtsdeklaration aus.
-
Danke für die Idee

Leider gab es sowas bisher net in ner Vorlesung, auch das Script geht hierauf nirgends ein, genauso wenig mein Buch. Ich glaube auch kaum, das der Prof es sich so vorgestellt hat (es wäre schon sehr weit von den Themen weg, die wir in der Vorlesung behandelt haben und noch behandeln werden).
Es kann aber gut sein, das die Kommunikation zwischen meinem Prof und seinem Hiwi etwas... gehinkt hat, wär net das erste mal ^^
Ich werd morgen mal den Prof selbst dazu fragen, das hat bisher immer Früchte getragen.
meanwhile... wenn jemand noch ne Idee hat, immer her damit
