elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16 17 18 19
61  Programación / Programación C/C++ / asignacion de array dinamico usando una variable no inicializada.. en: 6 Julio 2019, 19:35 pm
Hola amigos. que tal.

Tengo el siguiente caso:
Código
  1.  
  2. #include <iostream>
  3. #include <initializer_list>
  4.  
  5. struct x {
  6. private:
  7.     int * iArray = nullptr;
  8.     int tam;       //Sin inicializar
  9.  
  10. public:
  11.     x(std::initializer_list<int> lst) : iArray{new int[lst.size()}, tam{lst.size()}{
  12.          std::copy(lst.begin(), lst.end(), iArray);
  13.     }
  14.  
  15.     //Constructor de copia
  16.     x(const x & otherX);
  17.  
  18. };
  19.  
  20. //Definición de constructor de copia (notar aquí que al momento de hacer
  21. //la primera inicialización tam no ha recibido valor.
  22. x::x(const x & otherX) : iArray{new int[tam]}, tam{otherX.tam}{
  23.     for (int y = 0; y < tam; ++y){
  24.          iArray[y] = otherX.iArray[y];
  25.     }
  26. }
  27.  
  28. int main (){
  29.     x x0 {2, 4, 6};
  30.     x x1 = x0;   //copia correcta...
  31.  
  32.     //prueba directa de asignacion de una variable no definida a un array dinamico:
  33.  
  34.     int x;
  35.     int * arr = new int[x];     //error, x no está definida.
  36. }
  37.  

Como se puede observar, en la linea 22 se está inicializando el array dinamico con un tamaño de tam antes que inicializar al mismo tam, o sea, se esta inicializando con un valor desconocido...  sin embargo, esta funcionando bien, ahora bien, en la linea 35, se esta intentando crear un array dinamico con un tamaño x, pero no sirvio.... acaso la inicialización funciona distinto a la asignacion?

Gracias, saludos.

62  Programación / Programación C/C++ / Re: que editor usan en: 24 Junio 2019, 19:15 pm
Vim
63  Programación / Programación C/C++ / Re: Asignaciones e inicializacion de constructores.. en: 23 Junio 2019, 06:00 am
Entiendo, ya me va quedando todo mas claro... gracias por las respuestas..

Vaya Stroustup, que le gusta complicar las cosas, pero supongo que es para mejor...
64  Programación / Programación C/C++ / Re: Asignaciones e inicializacion de constructores.. en: 22 Junio 2019, 23:15 pm
Hola, tendre en cuenta esa convención de las variables, gracias.
puede ser de la siguiente forma?:

Código
  1. int un_numero = 6;
  2.  

o es mejor asi? :

Código
  1. int unNumero = 6;
  2.  


Respecto a la autoasignacion del operador =, C++ lo hara para todos los tipos creados por el usuario que no haya recargado el operador = ? o tiene distinciones ?..

Saludos y gracias.

65  Programación / Programación C/C++ / Asignaciones e inicializacion de constructores.. en: 22 Junio 2019, 22:05 pm
Buenas..

Me ha causado extrañeza la forma en que se puede inicializar un tipo a traves de un argumento al constructor:

Código
  1. struct s {
  2. private:
  3. int x = 0;
  4. public:
  5. s(int _x) : x{ _x } {}
  6. void p() const { std::cout << x; }
  7. int getx() const { return x; }
  8. };
  9.  
  10. int main() {
  11. s _s(5);                                       //forma argumento a constructor 1
  12. s _t = 6;                                     //forma argumento a constructor 2
  13. s _u{ 7 };                                   //forma argumento a constructor 3
  14. s _v = { 8 };                              //forma argumento a constructor 4
  15.  
  16. std::cout << std::endl;
  17. std::cout << _s.getx() << std::endl; //salida : 5
  18. std::cout << _t.getx() << std::endl; //salida : 6
  19. std::cout << _u.getx() << std::endl; //salida : 7
  20. std::cout << _v.getx() << std::endl; //salida : 8
  21. return 0;
  22. }
  23.  

Siempre he inicializado un tipo (que reciba un argumento de constructor) con los parentesis, es decir, tal como sale en la salida 5, es decir:
Código
  1. s _s(5);
  2.  


Sin embargo, estaba convencido que la siguiente linea solo tenia como fin la asignacion de un valor:
Código
  1. s _t = 6;
  2.  

Me ha parecido curioso porque se supone que una asignacion por regla general debe tener el mismo tipo que el asignado... sin embargo, el tipo s no es un entero.


Entonces me pregunto si esa linea realmente es una asignacion o lleva otro nombre....



66  Programación / Programación C/C++ / Re: Sobrecarga operador+ y miembro puntero... en: 19 Junio 2019, 05:22 am
@#Loretz.. efectivamente, olvide darle un valor por default en el constructor.
Respecto al puntero this, pues si, es que el código es borrador, lo hago nada mas que para fines de practica... en un reléase, el this lo utilizo siempre y cuanod tenga dos o mas variables que tengan el mismo nombre..

Aproposito, muchas gracias por compartir lo de la regla de 3...
creo que defintivamente tengo que echarle una repasadita al constructor de copia ademas..


#@String Manolo, pues si, solo que como el puntero d es privado, estoy accediendo con el getter..

67  Programación / Programación C/C++ / Re: Sobrecarga operador+ y miembro puntero... en: 19 Junio 2019, 00:48 am
Tienes razón!... me había preocupado de sobrecargar el operador + y no pensé en las consecuencias, debí haber cargado ademas el operador = y después << para imprimirlo...

La lección que me dio esto es que debo pensar en cada sobrecarga de operador necesaria pues una lleva a la otra...

Gracias
68  Programación / Programación C/C++ / Sobrecarga operador+ y miembro puntero... en: 18 Junio 2019, 22:11 pm
Hola nuevamente:

El siguiente código:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct s{
  6.  
  7. private:
  8.    double * d = nullptr;      
  9.  
  10. public:
  11.    s() : d{new double}{}
  12.    ~s(){ if (d != nullptr) delete d; }
  13.    void setd(const double _d){ *this->d = _d; }
  14.    double getd() const { return *this->d; }
  15.  
  16. };
  17.  
  18. s operator+(const s & _s0, const s & _s1){
  19.    s ns;
  20.    ns.setd(_s0.getd() + _s1.getd());
  21.    return ns;
  22. }
  23.  
  24. int main(){
  25.  
  26.    s s0;
  27.    s s1;
  28.  
  29.    s s2;
  30.    s2 = s0 + s1;
  31.  
  32.    return 0;
  33. }
  34.  
  35.  

Aqui listo para ejecutar:
https://onlinegdb.com/rJNPQ68kr

Al ejecutar, obtengo el mensaje de error:

*** Error in `./a.out': double free or corruption (fasttop): 0x0000000000795c80 ***                                             
Aborted (core dumped)


Estoy seguro que el problema esta entre el puntero privado y el delete en el destructor, ya que si no uso puntero, compila bien.

Sin embargo, he puesto puntero porque quiero entender qué está pasando.  Me da la impresión de que en la definición del operador+ como se crea el objeto ns al terminar el ámbito, se está destruyendo y esta eliminando el puntero.  Lo cual parece valido, pero no tendría por qué corromper la ejecución, se supone que estoy destruyendo un objeto de copia, no los operandos utilizados.

69  Programación / Programación C/C++ / Re: Sobrecarga de operador y constructores/destructores en: 18 Junio 2019, 15:35 pm
Mirate el link que te pasé que ahí te viene.

Si, gracias, Lo veo.
70  Programación / Programación C/C++ / Re: Sobrecarga de operador y constructores/destructores en: 17 Junio 2019, 19:42 pm
Vaya si, me he equivocado al replantear el ejemplo, debi reemplazar x por typeX al final en el cout...


Bueno, comentar que he pasado el argumento por referencia y ahí no me ejecutó el constructor....  lo cual ahora que lo veo bien si es lógico..

de repente es algo confuso saber cuando retornar una referencia o una copia y cuando aceptar un argumento como referencia o como copia en los operadores sobrecargados...

gracias por la ayuda..
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16 17 18 19
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines