0

Esta es mi clase cuenta, dentro de ella está en privado el número de cuenta:

private:
        int numeroCuenta;
        Cliente *cliente;
        Abono *lstAbono[TAM];
        float saldo;
        int contadorAbonos;
    public:
        Cuenta(int nC){
            this->numeroCuenta = nC;
            this->contadorAbonos = 0;
            this->saldo = 0;
        }

Y en mi main necesito buscar ese número de cuenta, pero no sé como acceder desde mi clase cuenta y hacer que encuentre específicamente mi número de cuenta:

int buscarCuenta(Cuenta *lstCu[],int conCu, int id){
    bool encontrado = false;
    int c = 0;
    int pos = -1;
    while(c<conCu && !encontrado){
        if(id == lstCu[c]{
            encontrado = true;
            pos = c;
        }
        else{
            c++;
        }
    }
    return pos;
}
JorgeGuz
  • 2,211
  • 2
  • 7
  • 24
  • ¿ El motivo por el que no puedes añadirle un método de acceso (*getter*) es ... ? – Trauma Mar 17 '20 at 05:29
  • No quieres poner un get por alguna razón en concreto? – eferion Mar 18 '20 at 11:48
  • Lo que intentas, al menos así sin explicar contexto ni nada, no tiene sentido. El encapsulamiento es una característica propia del las clases, no tiene sentido cargárselo. Usa una estructura en vez de una clase y ya está, si lo que quieres es tener un tipo de "objeto" con varios atributos dentro. – Intento_de_programador Mar 19 '20 at 19:50

2 Answers2

0

Es posible saltarse la restricción de acceso a los datos de un objeto usando ciertas malas artes. En esta respuesta se hace exactamente eso: acceder a un miembro privado de un objeto como si fuese público. No es sencillo, no es intuitivo, no genera un código amigable ni fácil de entender pero poderse se puede.

Pero no se debe.


Si necesitas un dato de un objeto para clasificarlo, tienes tres opciones:

  • Guarda el objeto junto a su identificador:

    map<int, Cuenta> cuentas;
    
    cuentas.emplace(1, 1);   // Cuenta 1
    cuentas.emplace(10, 10); // Cuenta 10
    cuentas.emplace(53, 53); // Cuenta 53
    
    // Busca la cuenta 10
    auto diez = cuentas.find(10);
    
  • Dota al objeto de una manera de informar de su identificador:

    int Cuenta::Numero() const { return numeroCuenta; }
    
    if (id == lstCu[c]->Numero()) {
        encontrado = true;
        // ...
    }
    
  • Haz que el objeto sea comparable contra enteros

    bool Cuenta::operator ==(int c) const {
        return numeroCuenta == c;
    }
    
    if (*lstCu[c] == id) {
        encontrado = true;
        // ...
    }
    

Otras cosas a tener en cuenta.

  • Por lo que puede verse de tu código, no necesitas buscar un número de cuenta si no su posición. Por favor, aclárate.
  • La función buscarCuenta recibe un puntero a una formación de punteros a Cuenta, después comparas punteros contra enteros (id == lstCu[c]), esto es incorrecto y te deben saltar algunas alarmas al compilar (que no compila, porque falta un paréntesis).
    • Los punteros en crudo están desaconsejados en C++ moderno, usa mejor contenedores de datos como std::list o std::vector, consulta esta pregunta para saber cuál se ajusta a tus necesidades.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
0

Acabo de utilizar el metodo el ultimo que colocaste, pero me da error.

int buscarCuenta(Cuenta *lstCu[],int conCu, int id){
    bool Cuenta::operator == (int c) const{
        return numeroCuenta == c;
    }
    bool encontrado = false;
    //int c = 0;
    int pos = -1;
    while(c<conCu && !encontrado){
        if(*lstCu[c]== id){
            encontrado = true;
            pos = c;
        }
        else{
            c++;
        }
    }
    return pos;
}

El error es el siguiente:

error: id-calificado en la declaración antes del token '('