Typumwandlungspolymorphie mittels Operator
-
Hi,
bei mir klemmst mal wieder ... Typumwandlungspolymorphie mittels Operator ... müsste ungefähr so aussehen nur bekomme ich immer die Fehlermeldung "(22)Multiplikation::Multiplikation': Kein geeigneter Standardkonstruktor verfügbar"
#include <iostream> #include <cstdlib> using namespace std; class Multiplikation { public: Multiplikation(const double& op1,const double& op2):op1_(op1),op2_(op2) { } double ergebnis() const { return op1_ * op2_; } protected: double op1_,op2_; }; class Addition { public: Addition(const double& op1,const double& op2):op1_(op1),op2_(op2) { } double ergebnis() const { return op1_ + op2_; } operator Multiplikation() const { return Multiplikation(); } protected: double op1_,op2_; }; void anzeigen(const Multiplikation & ausdruck) { cout << ausdruck.ergebnis() << endl; } int main() { Addition a(2,3); Multiplikation m(2,3); anzeigen(a); anzeigen(m); system("pause"); return 0; }
-
In Addieren::operator Multiplikation() rufst du den Standardkonstruktor von Multiplikation auf. Weil du aber einen Konstruktor schon selbst definiert hast, wird der Standardkonstruktor nicht automatisch ergänzt.
[EDIT] Willst du nicht sowas haben?
Multiplikation Addieren::operator Multiplikation() { return Multiplikation(op1_, op2_); }
-
habe es jetzt soweit berichtigt nur macht er jetzt immer nur Multiplikation ... mein Prof hat es in der Vorlesung nur sehr, sehr notdürftig an einem simplen Beispiel erklärt
#include <iostream> #include <cstdlib> using namespace std; class Multiplikation { public: Multiplikation(const double& op1,const double& op2):op1_(op1),op2_(op2) { } double ergebnis() const { return op1_ * op2_; } protected: double op1_,op2_; }; class Addition { public: Addition(const double& op1,const double& op2):op1_(op1),op2_(op2) { } double ergebnis() const { return op1_ + op2_; } operator Multiplikation const() { return Multiplikation(op1_, op2_); } protected: double op1_,op2_; }; void anzeigen(const Multiplikation & ausdruck) { cout << ausdruck.ergebnis() << endl; } int main() { Addition a(2,3); Multiplikation m(2,3); anzeigen(a); anzeigen(m); system("pause"); return 0; }
-
Is ja auch klar. Du übergibst zwei Werte, die addiert werden sollen, an Multiplikation. Du könntest es so machen:
return Multiplikation(sqrt(op1_, op2_), sqrt(op1_, op2_);
Du siehst, das ist nicht das Wahre. Das hängt mit deinem Konzept zusammen. Es macht einfach keinen Sinn, eine Addition wie eine Multiplikation zu behandeln. Hier hilft Vererbung.
Du baust einen Grundrechenarttyp und lässt Addition und Multiplikation davon erben:
#include <iosfwd> // wenn dus nicht kennst, denk dir einfach <iostream> class Grundrechenart { public: Grundrechenart(double op1, double op2) : op1_(op1), op2_(op2) { } virtual double rechne() = 0; // wird erst in abgeleiteten Klassen implementiert void anzeigen() { std::cout << rechne(); } protected: double op1_; double op2_; }; class Addition : public Grundrechenart { double rechne() { return op1_ + op2_; } }; class Multiplikation : public Grundrechenart { double rechne() { return op1_ * op2_; } };
-
danke ... habe es jetzt verstanden ... übung war so blöd aufgebaut das kein sinnvoller zzusammenhang mehr vorhanden war