2010-09-10 13 views
5

estoy tomando una expresión cuadrática, donde y=ax^2 + bx + c con a, b, c son constantes y x es una variable. Aquí está mi clase:Escribir un constructor prototipo en 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; 
}; 

soy para crear dos constructores para la clase de modo que la siguiente es legal

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

El constructor por defecto se debe establecer en cero, mientras que los parámetros en el segundo constructor indican valores iniciales para los coeficientes.

Así es como creo que debería hacer lo siguiente:

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

Sin embargo no estoy totalmente entender cómo hacer esto y agradecería cualquier ayuda en la gurús calcular esto.

Respuesta

20

Probablemente debería utilizar lista de inicialización de constructores en su lugar:

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

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

El anterior utiliza una parte del lenguaje C++ para miembro de inicializar variables llamadas lista de inicializadores.


Lo que hiciste por el constructor con parámetros:

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

En primer lugar no se compilará, pero incluso si usted simplifica lo que hizo para:

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

Entonces todavía no se compilará porque A, B y C ya están definidos. Cuando pones un nombre de tipo seguido de un nombre de variable como el anterior, intentará crear una nueva variable.

Así que si simplificamos nuevo a:

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

entonces esto es todavía mal otra vez, pero al menos va a compilar. Está mal porque está configurando los parámetros al valor de las variables de clase no inicializadas.

el contrario desea:

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

Lo que hiciste por el constructor sin parámetros:

double A, double B, double C = 0.0; 

Esto no se compilará.La sintaxis correcta para declarar muchas variables en una sola línea se realiza de la siguiente manera:

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

Pero esto todavía no es correcta, simplemente se va a crear 3 nuevas variables A, B, y C e inicializar a 0. Lo que realmente quiero es establecer sus variables miembro a, b y c.

Así que quieres:

a = b = c = 0;

+0

oh wow esto hace mucho más sentido entonces lo que tenía, y es limpiador y código más pequeño. agradezco mucho esto – HollerTrain

+4

+1 excelente ayuda y clasificación de la confusión de askers wrt a la declaración. – Elemental

+0

@HollerTrain: hice una pequeña edición por cierto así que si copió el código, vuelva a copiarlo. –

1

Use las listas de inicialización para inicializar las variables del miembro de la clase. Lo que has escrito es una tarea.

También el código en OP asigna a las variables locales definidas dentro del constructor y no a las variables de los miembros de la clase. Creo que la intención era para inicializar las variables miembro de la clase

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

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

Utilice la lista de miembros de inicialización:

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

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

ah sentido perfecto. ¿Cuál es la mejor manera de implementar esto en la función principal? – HollerTrain

4

La forma más directa y sencilla de hacer esto sería:

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

Declarar un segundo constructor sin parámetros y asignar todos los valores a 0 es también aceptable pero usa más código, para mí los valores predeterminados en el constructor son preferibles.

Ésta es la solución alternativa idénticos excepto por el hecho de que el uso de sólo 1 o 2 parámetros en el constructor ya no es válida:

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 Aunque es correcto no es lo que se especifica "soy para crear DOS constructores para la clase para que el siguiente sea legal", el suyo da un constructor y permite que se llame de 4 formas diferentes. –

+0

A la luz del hecho de que como dices, se puede invocar de cuatro maneras en lugar de las dos modifiqué el código para incluir el constructor predeterminado explícito – Elemental

+0

. Quizás quieras agregar la palabra clave 'explicit' a la declaración del codificador para evitar que se use en una conversión de doble a cuadrática. –

Cuestiones relacionadas