[APORTE] Programa para una tienda

Iniciado por Mario Olivera, 27 Abril 2015, 04:34 AM

0 Miembros y 1 Visitante están viendo este tema.

Mario Olivera

 Hola gente, les dejo un código fuente que hice en C++, es un programita sencillo, pero para el que esté estudiando el tema de la separación de la interfaz de la implementación usando un .h y dos .cpp, les va a ayudar, cualquier error o algo avisen.

PD: use el system("cls") porque la idea es mostrar un poco como se maneja la sepacion de la interfaz de la implementación, no como es la manera correcta de limpiar la consola xD SALUDOS!

main.cpp
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;

#include "cabezal.h"

int main()
{

programa llamador;
llamador.inicio();
cin.get();
return 0;
}


cabezal.h
Código (cpp) [Seleccionar]
class programa
{
public:
//FUNCIONES MIENBRO
void inicio();
void mostrarDatos();
void mostrarMenu();
void comprobarOption(int);
void nuevoProducto(int);
};

cabezal.cpp
Código (cpp) [Seleccionar]
#include <iostream>
using std::cout;
using std::endl;
using std::cin;

#include "cabezal.h"

//VARIABLES
int cantidadDeProductos;
int optionNuevoProducto;
int totalProductos= 0;
double precioProducto;
double total = 0;

void programa::inicio()
{
mostrarDatos();
mostrarMenu();
}
void programa::mostrarDatos()
{
cout <<endl <<endl;
cout <<"\t. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  ."
<<"\n\t.                   SUPER-M V 1.0 FIX 0                        ."
<<"\n\t.                                                              ."
<<"\n\t.  DP: MARIO.OLIVERA96@GMAIL.COM                               ."
<<"\n\t.  SINCE: 2015                                                 ."
<<"\n\t  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  "
<<endl <<endl <<endl;
}
void programa::mostrarMenu()
{
int option;
cout <<"MENU" <<endl <<endl;
cout <<"(1) Nuevo Producto\n(2) Terminar compra\n\n";
cout <<"Option: ";
cin >> option;
cout <<"\a";
comprobarOption(option);
}
void programa::comprobarOption(int option)
{

switch (option)
{
case 1:
system("cls");
cout <<"Precio: ";
cin  >> precioProducto;
cout <<"\a\nCantidad: ";
cin  >> cantidadDeProductos;
cout <<"\a\n(1)LISTO\t(2) ATRAS\nOption: ";
cin  >> optionNuevoProducto;
cout <<"\a";
nuevoProducto(optionNuevoProducto);




break;

case 2:
system("cls");
if (totalProductos <= 0)
{
cout <<"COMPRA TERMINADA.\n\nCantidad de productos: 0\n\nTotal a pagar: $0.00"<<endl;
cin.get();
cin.get();
system("cls");
inicio();
}
else
{
cout <<"COMPRA TERMINADA.\n\nCantidad de productos: " <<totalProductos <<"\n\nTotal a pagar: $" <<total <<endl;
cin.get();
cin.get();
total=0;
totalProductos=0;
system("cls");
programa();
}
break;
default:
system("cls");
cout <<"\nVALOR INVALIDO!\nPRESIONE ENTER.\n";
cin.get();
cin.get();
system("cls");
inicio();
break;
cout <"ja!\n";
cin.get();
}
}
void programa::nuevoProducto(int optionNuevoProducto)
{

switch (optionNuevoProducto)
{
case 1:
if ((precioProducto >= 0) && (cantidadDeProductos >= 0))
{
totalProductos+= cantidadDeProductos;
total+= cantidadDeProductos * precioProducto;
cout<<totalProductos <<" "<<total;
cin.get();
system("cls");
inicio();
}

else
{
cout <<"\nVALORES INVALIDOS!\nPRESIONE ENTER\n";
cin.get();
cin.get();
comprobarOption(1);
}

break;

case 2:
system("cls");
inicio();
break;
}
}

eferion

Buenos días.

Si me aceptas la crítica:

1. La lógica de tu "programa" no debería residir en un constructor. Eso es, por decirlo de forma suave, una aberración. Es mucho mejor tener un método público en "programa" para realizar esta tarea.

2. Separas interfaz de implementación... pero ya está. Creo que el ejemplo sería más útil si separases además la lógica de presentación de la lógica de negocio.

3. Llamar al constructor de la clase desde un miembro sin crear una instancia nueva es otra aberración consecuencia directa de lo comentado en el punto 1. Otro motivo más para cambiar eso.

4. Si una función miembro de una clase no modifica el estado del objeto lo suyo es que sea etiquetada como "const". Si además resulta que dicha función no accede al estado del objeto (las variables miembro de la clase), lo lógico es que dicha función fuese etiquetada como "static". Por cierto, no puedes usar "static" y "const" a la vez en la misma función miembro (básicamente porque una función static no puede acceder, y por tanto modificar, a nada que no sea estático... de hecho en esta función no existirá el puntero implícito "this").

Te animo a seguir mejorando el ejemplo ;)

Un saludo