[C con Clase] duda con clase

Davidson, Steven srd4121 en njit.edu
Mar Ene 21 20:03:36 CET 2014


Hola Humberto,

2014/1/21 Humberto Boone Abdo <humbba1 en yahoo.com>

> Buenas,
>
>

[CORTE]

Mis dudas son que no estoy seguro si hice bien el constructor y no se como
> hacerle para que cuando pide la descripción se puedan introducir caracteres
> espacio y no sólo la primera palabra que escribo.(Bueno  intente usar la
> función getline pero no me funcionó)
>

Esto tiene que ver con el uso de 'cin >>'. Como usas la clase 'string', usa
la función global, 'getline()'. Esto es,

string str;

getline( cin, str );

Tampoco entiendo si cree bien los objetos, porque cuando dejaba los
> paréntesis vacíos me daba error y lo que hice fue ponerle ("","",0,0) y así
> fue como funcionó pero no estoy seguro si sea una buena idea optar por eso.
>

Te da un error, porque estableciste que el constructor recibe 4 parámetros.
Si no das los parámetros, entonces no sabe qué hacer, porque no hay otra
forma de invocar el constructor.

Una solución es crear otro constructor que no acepte ningún parámetro. Por
ejemplo,

class Factura
{
public:
  Factura() : nompieza(""), descpieza(""), cantart(0), precioart(0)  {}
  Factura( const string &pieza, const string &desc, int cant, int precio )
 {...}
  ...
};

Además, como puedes ver, te he cambiado los tipos de los parámetros para
pasar los objetos como 'const string &', en lugar de 'string', porque
entonces estás creando copias de los objetos, para luego crear otra copia
al hacer esta asignación:

nompieza = pieza;
descpieza = desc;


Analizando el código fuente, veo algunas cosas más a destacar:

- Para el constructor, invocas otras funciones miembro para asignar los
valores. Otra opción es usar la lista inicializadora (del constructor):

Factura( const string &pieza, const string &desc, int cant, int precio ) :
nompieza(pieza), descpieza(desc), cantart(cant), precioart(precio)
{
  // Puedes seguir otros pasos
  ...
}

- A la hora de establecer el precio y de calcular el monto, usas una
sentencia 'if'. Otra forma es usando el operador condicional. Por ejemplo,

void establecerPrecio( int precio )
{
  precioart = precio < 0 ? 0 : precio;
}

- Tienes un error en 'obtenerMontoFactura()'. Escribes:

monto = cantart + precioart;

cuando debe ser una multiplicación.

- En 'main()', instancias el objeto 'factura1', para luego invocar las
funciones miembro para "establecer" los datos miembro. Otra forma es
instanciar el objeto cuando tengamos los datos necesarios. Por ejemplo,

getline( cin, numpieza );
...
cin >> precioa;

Factura factura1( numpieza, desc, canta, precioa );

Instanciamos el objeto justo cuando necesitemos usarlo.


Espero que esto te oriente.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20140121/22a89e86/attachment.html>


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