konstruktor
-
genau, der konstruktor funktioniert hier ähnlich wie eine funktion.
wenn der Konstruktor
punkt(float xx,float yy);
aufgerufen werden soll, musst du ihm auch die beiden float-werte übergeben. Es wird anhand der Parameter automatisch der richtige Konstruktor ausgewählt.
mfg
Horst
-
hm...
also
http://home.arcor.de/incomplete/c++.jpg
hier sollten bei instanz p2 die werte vom spezialkonstruktor stehen
330.251 und 586.243
-
dann musst du im code die Klasse p2 wiefolgt erstellen:
punkt p2(330.251, 586.243);
-
em ja genau^^ aber das war mir halt zu einfach
weil ich das ja schon in p1, welcher mit dem standartkonstruktor arbeitet,
gemacht habeich wollte quasie in p2 den compiler "zwingen" den spezialkonstruktor zu nehmen, wobei ich nicht ganz sicher bin ob x=xx=330.251 anerkannt wird
und in p3 dann, wird der wert wieder bei der initialisierung geändertHorst2 schrieb:
genau, der konstruktor funktioniert hier ähnlich wie eine funktion.
wenn der Konstruktor
punkt(float xx,float yy);
aufgerufen werden soll, musst du ihm auch die beiden float-werte übergeben. Es wird anhand der Parameter automatisch der richtige Konstruktor ausgewählt.
mfg
Horstgenau aba ich hab halt keinen dunnst wie ich das korrekt ins programm bringen soll
-
ich meld mich jetz erstmal an, kann nicht editieren^^
-
Also noch mal zur Erklärung.
Du hast z.B. 3 Konstruktoren.
Konstruktor1: punkt ();
Konstruktor2: punkt (float x, float y);
Konstruktor3: punkt (int a);Wenn du jetzt in deinem code punkt p; benutzt, wird Konstruktor1 aufgerufen.
Schreibst du punkt p(5.2, 6.1); wird Konstruktor2 aufgerufen.
Schreibst du punkt p(25); wird Konstruktor3 aufgerufen.Also: Der Compiler unterscheidet anhand der Parameter welcher Konstruktor der richtige ist. Man nennt das function-overloading
-
hm ich werd mal was versuchen^^
dankÖ
-
Horst2 schrieb:
Also noch mal zur Erklärung.
Du hast z.B. 3 Konstruktoren.
Konstruktor1: punkt ();
Konstruktor2: punkt (float x, float y);
Konstruktor3: punkt (int a); // Der Konstruktor hier führt zu ÄrgerWenn du jetzt in deinem code punkt p; benutzt, wird Konstruktor1 aufgerufen.
Schreibst du punkt p(5.2, 6.1); wird Konstruktor2 aufgerufen.
Schreibst du punkt p(25); wird Konstruktor3 aufgerufen.Also: Der Compiler unterscheidet anhand der Parameter welcher Konstruktor der richtige ist. Man nennt das function-overloading
// Float ist übrigens ein Datentyp mit dem man sich nur herumärgern kann. // Wenn Du zum Beispiel später einmal Funktionen schreibst, mit denen Du // etwa vergleichen möchtest, ob zwei Punkte identisch sind, und die beiden // Punkte durch irgendwelche Berechnungen zustande gekommen sind, dann ist // es aufgrund der Rundungsfehler praktisch sicher, dass niemals zwei Punkte // identisch sind, auch dann nicht, wenn sie es eigentlich sein müssten. // vielleicht überlegst Du Dir, als Datentypen für die Koordinaten des Punktes // ganzzahlige Werte zu verwenden, dann kannst Du mit den Punkten getrost // rechnen, solange du willst - keine Rundungsfehler == nie wieder falsche // Resultate. Wenn Du allerdings bei Deinen Berechnungen unbedingt Wurzel- // ziehen musst, dann versuch mal eine Struktur wie die folgende zu ver- // wenden: class Rundungssicher{ public: long ZaehlerBasis; long NennerBasis; long ZaehlerExponent; long NennerExponent; }; Eine Zahl in dem dem Format (Basis ist rational, Exponent ist auch rational) würde beipielsweise eine Quadratwurzel von 7 so speichern ... ZaehlerBasis=7; NennerBasis=1; ZaehlerExponent=1; NennerExponent=2; // ... also auch erlauben, beliebige reelle Zahlen (auch die irrationalen) // ... 'ganzzahlig zu machen', also Rundungsfehler prinzipiell auszu- // ... schließen. Ist vielleicht auch eine sehr gute Übung, die Operatoren // ... und ein Bündel praktischer Funktionen für so einen Datentyp zu // ... schreiben, um einfach einmal die Syntaxkenntnisse zu trainieren. // ... Und das tolle an der Übung ist dass Du dann eine Bibliothek hast, // ... die einen äußerst flexiblen Datentyp für Reelle Zahlen bereitstellt, // ... und auf die Du dann noch oft zurückgreifen wirst. // Wie gesagt, float oder double sind wirklich nur Notlösungen, spätestens // wenn's an geometrische Aufgaben geht, wird's Zeit, dem Rundungsfehler // den Schneid abzukaufen.
// Bezüglich Deiner Punkt-Klasse:
// Ansonsten sollte man sich das Schreiben von Konstruktoren, die mit nur
// einem einzigen Parameter aufgerufen werden können, immer doppelt über-
// legen. Die werden dann nämlich mitunter einfach zum Konvertieren des
// Paramtertyps in den Typ deiner Klasse verwendet, das generiert dann
// oft äußerst schwer zu findende Fehler.
-
und wie würde bei so einem datentyp eine addition aussehen (selbstverständlich rundungssicher) ? du wirst schnell feststellen, dass du algebraische zahlen höchtens mit dynamischen datentypen rundungssicher in den griff bekommst...
-
HansImSuff schrieb:
// Bezüglich Deiner Punkt-Klasse:
// Ansonsten sollte man sich das Schreiben von Konstruktoren, die mit nur
// einem einzigen Parameter aufgerufen werden können, immer doppelt über-
// legen. Die werden dann nämlich mitunter einfach zum Konvertieren des
// Paramtertyps in den Typ deiner Klasse verwendet, das generiert dann
// oft äußerst schwer zu findende Fehler.Für genau solche sorgen existiert das Schlüsselwort explicit