[C con Clase] constructor con valores definidos

Steven Davidson srd4121 en njit.edu
Mie Ene 19 05:53:10 CET 2011


Hola Omar,

On 1/18/2011 9:52 PM, omar mendoza wrote:
> Hola, en lenguaje C se puede definir una función de la siguiente
> manera:
>
> void funcion(int numero1, int numero2=0)
>
> se puede hacer esto en C++??
>

La verdad es que en C no se puede hacer lo que dices, pero en C++ sí. Si 
tienes un compilador de C que sí acepta parámetros por defecto, entonces 
será una extensión al lenguaje y por tanto no es una prestación que 
pertenezca al estándar de ANSI C.

> tengo lo siguiente
>

[CORTE]

> y me sale éste error
>
> omar en debian:~/trabajo/pruebas$ g++ pruebas.cpp main.cpp -o main -g
> /tmp/ccZyW4Ay.o: In function `Prueba':
> /home/omar/trabajo/pruebas/pruebas.cpp:17: multiple definition of
> `Prueba::Prueba(int, int, int)'
> /tmp/cc31SRVF.o:/home/omar/trabajo/pruebas/pruebas.cpp:17: first
> defined here
> /tmp/ccZyW4Ay.o: In function `Prueba':
> /home/omar/trabajo/pruebas/pruebas.cpp:17: multiple definition of
> `Prueba::Prueba(int, int, int)'
> /tmp/cc31SRVF.o:/home/omar/trabajo/pruebas/pruebas.cpp:17: first
> defined here
> /tmp/ccZyW4Ay.o: In function `Prueba::print()':
> /home/omar/trabajo/pruebas/pruebas.cpp:24: multiple definition of
> `Prueba::print()'
> /tmp/cc31SRVF.o:/home/omar/trabajo/pruebas/pruebas.cpp:24: first
> defined here
> collect2: ld returned 1 exit status
>

Según los mensajes de error que te salen, estás definiendo las mismas 
funciones en la misma compilación. Sospecho que has incluido las 
definiciones de las funciones en varios ficheros fuente. Asegúrate de 
que incluyes cada fichero de cabecera que necesitas UNA sola vez. Para 
esto, usa las directivas del precompilador. Por ejemplo,

// "pruebas.h"
#ifndef _PRUEBAS_H_
   #define _PRUEBAS_H_

class Prueba
{
public:
   Prueba();
   Prueba( int, int, int );
   void print();

private:
   int x;
   int y;
   int z;
};

#endif


// "pruebas.cpp"
#include <iostream>
#include "pruebas.h"
...


// "main.cpp"
#include <iostream>
#include "pruebas.h"

int main()
{
   ...
}


Como puedes ver, incluimos "pruebas.h" una sola vez en cada fichero 
fuente que lo necesita.

Aparte de esto, tienes un error en el código que nos has presentado, ya 
que no tienes una definición para el constructor sin parámetros. Es 
decir, no tienes el siguiente constructor:

Prueba::Prueba()  {...}


El otro error es en 'main()'. Usas el operador 'new' pero al liberar la 
memoria usas la función 'free()' de ANSI C. Esto no es correcto. Si usas 
'new' debes usar 'delete'. No mezcles los operadores de gestión de 
memoria de C++ con las funciones de ANSI C.


Espero que esto te oriente.

Steven





Más información sobre la lista de distribución Cconclase