No soy de C++, lo he visto de pincelada, lo mio es el C.
Pero a mi modo de ver el cliente solo debería guardar su saldo, aumentarlo o disminuirlo. Para más seguridad estas deberían ser incluso operaciones privadas a las que no se pudieran acceder desde ningún lugar, solo desde el cajero. Deberían ser funciones amigas.
El encargado de ingresar, retirar o ver el capital del cliente es el cajero y de éste dependen las reglas para hacerlo. Por ejemplo: si se intenta sacar más del capital que hay la operación falla.
Algo así:
#include <iostream>
using namespace std;
class Cliente{
public:
Cliente() {
capital = 0;
}
double obtenerCapital() {
return capital;
}
void ingreso(double cantidad) {
capital += cantidad;
}
void retiro(double cantidad) {
capital -= cantidad;
}
private:
double capital;
};
class Cajero {
public:
Cajero() {
_cliente = NULL;
}
void nuevoCliente(Cliente &cliente) {
_cliente = &cliente;
}
#define SI_HAY_CLIENTE() if(!_cliente) { \
cout << "No hay un cliente definido para realizar esta accion." << endl; \
return; } else ;
#define SI_TIENE_PERMISO(permiso, mensajeError) if(!permiso) { \
cout << "Operacion denegada.\nRazon: " << mensajeError << "\n" << endl; \
return; } else ;
void ingreso(double cantidad) {
bool permiso = true;
string razon = "";
SI_HAY_CLIENTE() {
// Condiciones que permiten el ingreso. Si no es posible
// hacer permiso false y rellenar la razón
SI_TIENE_PERMISO(permiso, razon) {
_cliente->ingreso(cantidad);
cout << "Ingresados " << cantidad << " creditos.\n" << endl;
}
}
}
void retiro(double cantidad) {
bool permiso = true;
string razon = "";
SI_HAY_CLIENTE() {
// Condiciones que permiten el retiro. Si no es posible
// hacer permiso false y rellenar la razón
// Un ejemplo sería que no hubiera suficiente capital
if(cantidad > _cliente->obtenerCapital()) {
permiso = false;
razon = "No hay capital suficiente para realizar esta operacion.";
}
SI_TIENE_PERMISO(permiso, razon) {
_cliente->retiro(cantidad);
cout << "Retirados " << cantidad << " creditos de la cuenta.\n" << endl;
}
}
}
void obtenerCapital() {
SI_HAY_CLIENTE()
cout << "Capital actual: " << _cliente->obtenerCapital() << " creditos.\n" << endl;
}
#undef SI_TIENE_PERMISO
#undef HAY_CLIENTE
void cerrarCliente() {
_cliente = NULL;
}
private:
Cliente *_cliente;
};
int main() {
Cliente p1;
Cajero cajero;
cajero.nuevoCliente(p1);
cajero.ingreso(2000);
cajero.retiro(500);
cajero.obtenerCapital();
cajero.ingreso(100);
cajero.obtenerCapital();
cajero.retiro(3000);
cajero.obtenerCapital();
cajero.cerrarCliente();
cajero.obtenerCapital();
return 0;
}