2010-09-10 7 views
5

sto prendendo un'espressione quadratica, dove y=ax^2 + bx + c con a, b, c sono costanti e x è una variabile. Qui è la mia classe:Scrivi prototipo di costruzione della C++

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; 
}; 

Sono per creare due costruttori per la classe in modo che la segue è legale

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

Il costruttore di default deve essere impostato a zero, mentre i parametri del secondo costruttore indicano valori iniziali per i coefficienti.

Ecco come credo dovrei farlo:

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; 
} 

Tuttavia non sto pienamente capire come impostare questa funzione e gradirebbe qualsiasi guru aiutano a capire questo fuori.

risposta

20

Probabilmente si dovrebbe usare lista di inizializzazione dei costruttori invece:

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

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

È possibile che utilizza una parte del linguaggio C++ per inizializzare membro le variabili hanno chiamato un elenco di inizializzazione.


Quello che hai fatto per il costruttore con i parametri:

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

Prima di tutto non si compila, ma anche se si semplificare quello che hai fatto a:

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

Poi è ancora non verrà compilato perché A, B e C sono già definiti. Quando inserisci un nome di tipo seguito da un nome di variabile come sopra, proverà a creare una nuova variabile.

Quindi, se semplifichiamo di nuovo a:

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

Allora questo è ancora sbagliato di nuovo, ma almeno sarà la compilazione. È sbagliato perché stai impostando i parametri sul valore delle variabili di classe non inizializzate.

Invece si vuole:

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

Quello che hai fatto per il costruttore senza parametri:

double A, double B, double C = 0.0; 

Questo non verrà compilato.La sintassi diritto di dichiarare molte variabili in una sola riga è la seguente:

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

Ma questo non è ancora corretta, sarà sufficiente creare 3 nuove variabili A, B, e C e li inizializza a 0. Quello che vuole davvero è impostare le variabili membro a, b, e c.

Così si vuole:

a = b = c = 0;

+0

wow questo rende molto più senso allora quello che avevo, ed è codice più pulito e più piccolo. lo apprezzo molto – HollerTrain

+4

+1 eccellente aiuto e risoluzione della confusione degli utenti alla dichiarazione. – Elemental

+0

@HollerTrain: ho fatto una piccola modifica btw quindi se hai copiato il codice ricodificarlo. –

1

Utilizzare gli elenchi di inizializzazione per inizializzare le variabili dei membri della classe. Quello che hai scritto è un incarico.

Anche il codice in OP assegna alle variabili locali definite all'interno del costruttore e non alle variabili dei membri della classe. Credo che l'intenzione era quella di inizializzare le variabili membro della classe

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

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

utilizzare l'elenco membro di inizializzazione:

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

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

ah senso perfetto. qual è il modo migliore per implementarlo nella funzione principale? – HollerTrain

4

Il modo più diretto e semplice di fare questo sarebbe:

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; 
}; 

Dichiarazione di una secondo costruttore senza parametri e assegnando tutti i valori a 0 è anche accettabile ma utilizza più codice, per me sono preferibili i valori predefiniti nel costruttore.

Questa è la soluzione alternativa identiche tranne per il fatto che l'utilizzo di solo 1 o 2 parametri nel costruttore non è più valida:

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 Anche se corretto non è quello che viene specificato "sto per creare DUE costruttori per la classe in modo che quanto segue sia legale", il tuo dà un costruttore e gli permette di essere chiamato in 4 modi diversi. –

+0

Alla luce del fatto che come dici tu possa essere chiamato in 4 modi piuttosto che i due ho modificato il codice per includere il costruttore esplicito predefinito – Elemental

+0

Puoi aggiungere la parola chiave 'explicit' alla dichiarazione -ctor per impedire che venga utilizzato in una conversione da doppia a quadratica. –

Problemi correlati