Este programa duplica el entero de cada segundo para el número de cuenta dado y si el número es mayor que 10, se resta por 9. Luego, muestra si el número ingresado es correcto o no. Suponiendo que el número de cuenta está fuera de 5 números. Escribí este programa pero no obtengo la respuesta para algunos números, pero obtuve una respuesta correcta para otro número. Gracias por la pista.

#include <iostream>

class AccountNumber {

private:
  int size = 5;

  int *p;

public:
  AccountNumber() { int *p = new (std::nothrow) int[size]; }

  ~AccountNumber() { delete[] p; }

  void getaccount() {
    int acc;
    std::cout << "Enter the account number: ";
    std::cin >> acc;
    for (int i = 0; i < size; i++) {
      p[i] = acc % 10;
    }
    setaccount(p);
  }

  void setaccount(int a[]) {
    for (int i = 0; i < size; i++) {
      p[i] = a[i];
    }
  }

  void doubles() {
    AccountNumber at;
    at.p = new int[size];
    at.p = p;
    for (int i = 0; i < size; i++) {
      if (i % 2 == 1) {
        at.p[i] = at.p[i] * 2;
        if (at.p[i] > 10) {
          at.p[i] = at.p[i] - 9;
        }
      }
    }
    p = at.p;
  }

  bool sum() {
    bool ot;
    int sum = 0;
    for (int i = 0; i < size; i++) {
      sum = sum + p[i];
    }
    int mod = sum % 10;
    if (mod == 0) {
      ot = true;
    } else {
      ot = false;
    }
    return ot;
  }

  void display(std::ostream &outs) {
    bool ot = sum();
    doubles();
    outs << "Account number entered is ";
    if (ot) {
      outs << " correct.\n";
    } else {
      outs << " is not correct. \n";
    }
  }
};

int main(int argc, char const *argv[]) {
  AccountNumber accn;
  accn.getaccount();
  accn.display(std::cout);
  return 0;
}

Salida

Enter the account number: 35556
Segmentation fault (core dumped)

No sé a dónde voy mal.

c++
-1
Raj 12 mar. 2021 a las 13:59

1 respuesta

La mejor respuesta

El problema aquí es que nunca asigna p. Mira tu constructor:

AccountNumber() 
{
    int *p = new(std::nothrow) int[size];
}

Aquí está definiendo una nueva variable de puntero p, que se utilizará en lugar de la miembro variable de puntero p que definiste en los campos private. Lo que sucede aquí es que está asignando una matriz int para una nueva variable p, pero esa variable p se descarta al final del constructor (y también causa una pérdida de memoria porque de la asignación dinámica que nunca se reclamará).

Lo que debería hacer aquí en su lugar es simplemente asignar la nueva matriz asignada a la variable de puntero miembro p sin redefinirla, es decir.

AccountNumber() {
    p = new (std::nothrow) int[size];
}

Y para evitar que esos errores vuelvan a ocurrir, debería considerar el uso de una convención de nomenclatura específica para los miembros de la clase, como el prefijo m_ (por ejemplo)

class AccountNumber {
private:
    int m_size = 5;
    int *m_p;
public:
    AccountNumber() {
        m_p = new (std::nothrow) int[size];
    }
};
2
michaeldel 12 mar. 2021 a las 11:17