2010-09-10 14 views
5

ich einen quadratischen Ausdruck nehme, wo y=ax^2 + bx + c mit a, b, c Konstanten sind und x ist eine Variable. Hier ist meine Klasse:einen Prototyp Constructor in C++ schreiben

class quadratic { 
public: 
double evaluate(const double x); 
void getCoefficients (double &A, double &B, double &C); 
void setCoefficients (const double A, const double B, const double C); 

private: 
double a; 
double b; 
double c; 
}; 

Ich bin zwei Konstruktoren für die Klasse zu schaffen, so dass die folgende Rechts ist

quadratic y1 = quadratic(1.0, -5.0, 7.0); 
quadratic y2 = quadratic(-3.0, -2.0, 10.0); 
quadratic y3; 

Der Defaultkonstruktor sollte auf Null gesetzt werden, während die Parameter in dem zweiten Konstruktor angeben Anfangswerte für die Koeffizienten.

Hier ist, wie ich glaube, ich sollte das tun:

quadratic() //default values 
{ 
double A, double B, double C = 0.0; 
} 

quadratic(double A, double B, double C) //initial values 
{ 
double A = double a; 
double B = double b; 
double C = double c; 
} 

Jedoch habe ich nicht voll bin zu verstehen, wie diese einzurichten und keine Gurus helfen, dies herauszufinden, schätzen würde.

Antwort

20

Sie sollten wahrscheinlich verwenden die Konstrukteurs Initialisiererliste stattdessen die Membervariablen der Klasse zu initialisieren war:

quadratic() : a(0), b(0), c(0) 
{ 
} 

quadratic(double A, double B, double C) : a(A), b(B), c(C) 
{ 
} 

Die oben verwendet einen Teil der Sprache C++ Mitglied zu initialisieren Variablen werden als Initialisierungsliste bezeichnet.


Was haben Sie für den Konstruktor mit Parametern:

double A = double a; 
double B = double b; 
double C = double c; 

Zu allererst wird nicht kompiliert, aber selbst wenn Sie vereinfachen, was Sie taten zu:

double A = a; 
double B = b; 
double C = c; 

es dann wird immer noch nicht kompiliert, da A, B und C bereits definiert sind. Wenn Sie einen Typnamen gefolgt von einem Variablennamen wie oben eingeben, wird versucht, eine neue Variable zu erstellen.

Wenn wir also vereinfachen wieder:

A = a; 
B = b; 
C = c; 

Dann ist dies immer noch wieder falsch, aber zumindest wird es kompilieren. Es ist falsch, weil Sie die Parameter auf den Wert der nicht initialisierten Klassenvariablen festlegen.

Stattdessen wollen Sie:

a = A; 
b = B; 
c = C; 

Was Sie für den Konstruktor haben ohne Parameter:

double A, double B, double C = 0.0; 

Diese kompilieren nicht.Die richtige Syntax viele Variablen in einer einzigen Zeile zu erklären, ist wie folgt:

double A = 0, B = 0, C = 0; 

Aber das ist immer noch nicht richtig, es wird einfach drei neue Variablen A, B erstellen, und C und initialisieren sie auf 0. Was Sie wirklich wollen Sie Ihre Mitgliedsvariablen a, b und c setzen.

Sie wollen also:

a = b = c = 0;

+0

oh wow das viel mehr Sinn macht dann, was ich hatte, und ist sauberer und kleiner Code. sehr zu schätzen wissen. – HollerTrain

+4

+1 ausgezeichnete Hilfe und Aussortierung der Fragesteller Verwirrung zu Erklärung. – Elemental

+0

@HollerTrain: habe ich eine kleine bearbeiten btw also, wenn Sie den Code kopiert, um es wieder abschreiben. –

1

Verwenden Sie Initialisierungslisten zum Initialisieren von Klassenmembervariablen. Was Sie geschrieben haben, ist Aufgabe.

Auch der Code in OP weist lokalen Variablen, die im Konstruktor definiert sind, und nicht den Variablen des Klassenelements zu. Ich denke, die Absicht

quadratic() : a(0.0), b(0.0), c(0.0) 
{ 
} 

quadratic(double A, double B, double C) : a(A), b(B), c(C) 
{ 
} 
2

das Mitglied Initialisiererliste Verwendung: ohne Parameter und die Zuordnung aller Werte auf 0

class quadratic { 
public: 
    explicit quadratic(double A=0,double B=0,double C=0): a(A),b(B),c(C) { } 
    double evaluate(const double x); 
    void getCoefficients (double &A, double &B, double &C); 
    void setCoefficients (const double A, const double B, const double C); 

private: 
    double a; 
    double b; 
    double c; 
}; 

einen zweiten Konstruktor Deklarieren auch ist:

quadratic(): 
    a(0),b(0),c(0) 
{} 

quadratic(double a_,double b_,double c_): 
    a(a_),b(b_),c(c_) 
{} 
+0

ah perfekter Sinn. Was ist der beste Weg, dies in der Hauptfunktion zu implementieren? – HollerTrain

4

Die direkte und einfache Möglichkeit, dies wäre zu tun, akzeptabel, aber verwendet mehr Code, für mich sind die Standardwerte im Konstruktor vorzuziehen.

Dies ist die alternative Lösung identisch, mit Ausnahme der Tatsache, dass nur 1 oder 2 Parameter im Konstruktor ist nicht mehr gültig:

class quadratic { 
public: 
    quadratic(double A,double B,double C): a(A),b(B),c(C) { } 
    quadratic(): a(0), b(0), c(0) { } 
    double evaluate(const double x); 
    void getCoefficients (double &A, double &B, double &C); 
    void setCoefficients (const double A, const double B, const double C); 

private: 
    double a; 
    double b; 
    double c; 
}; 
+1

+1 Obwohl richtig ist es nicht, was spec'ed out „ist zwei Konstruktoren für die Klasse zu schaffen, so dass die folgenden legal ist“, geben Sie einen Konstruktor und ermöglicht es in 4 diff Arten aufgerufen werden. –

+0

In Anbetracht der Tatsache, dass, wie Sie sagen können in 4 Arten aufgerufen werden, anstatt der zwei modded ich den Code der expliziten Standardkonstruktors enthalten – Elemental

+0

Sie könnten die 'explicit' Keyword an die Ctor-Deklaration, um hinzufügen möchten verhindern, dass es in einer Doppel-zu-Quadrats-Umwandlung verwendet wird. –