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

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [16] 17 18 19
151  Programación / Programación C/C++ / Re: Punteros fantasmas... (asi le puse yo).. en: 13 Febrero 2019, 13:15 pm
buen punto... lo tendré en cuenta la siguiente vez..  :)
152  Programación / Programación C/C++ / Sobrecarga de operador << solo me compila si uso la palabra "friend" en: 13 Febrero 2019, 04:44 am
Buenas amigos..

Tenía entendido que la palabra reservada "friend" permitía acceder a todas mis variables privadas de mi clase desde fuera, es como una excepción a la regla, para friend sería todo publico.

He querido utilizar el operador sobrecargado << para que mi clase pueda ser impresa por la salida estándar.

Esto es lo que tengo:

Código
  1. //Persona.h
  2. #include <iostream>
  3.  
  4. class Persona{
  5.  
  6.     char * nombre;
  7.     int edad;
  8.  
  9. public:
  10.  
  11.     Persona();
  12.     ~Persona();
  13.  
  14.     //La siguiente linea da error si no coloco la palabra friend al principio
  15.     std::ostream & operator<<(std::ostream & os, Persona & _estaPersona);
  16.     char * LeerNombre() const;
  17.     int LeerEdad() const;
  18.     void InsertarNombre(const char * _nuevoNombre);
  19.     void InsertarEdad(const int _nuevaEdad);
  20.  
  21. };
  22.  


Código
  1. //Persona.cpp
  2.  
  3. #include "Persona.h"
  4.  
  5. using namespace std;
  6.  
  7. //Sobrecarga operador
  8. ostring & operator<<(ostring & os, const Persona & _estaPersona){
  9.     os << "Nombre : " << _estaPersona.LeerNombre() << endl;
  10.     os << "Edad     : " << _estaPersona.LeerEdad() << endl;
  11.     return os;
  12. }
  13.  
  14. char * Persona::LeerNombre(){
  15.     return nombre;
  16. }
  17.  
  18. int Persona::LeerEdad(){
  19.     return edad;
  20. }
  21.  
  22. void Persona::InsertarNombre(const char * _nuevoNombre){
  23.     strcpy(nombre, _nuevoNombre);
  24. }
  25.  
  26. void Persona::InsertarEdad(const int _nuevaEdad){
  27.     edad = _nuevaEdad;
  28. }
  29.  
  30.  

Código
  1. //main.cpp
  2. #include Persona.h
  3.  
  4. int main (){
  5.     Persona p;
  6.     p.InsertarNombre("ElHacker");
  7.     p.Edad(37);
  8.  
  9.     std::cout << p << endl;
  10. }
  11.  

Lo que no entiendo, es que según la definición de friend, esto no me calza, yo no quiero acceder desde fuera a una propiedad privada, solo estoy intentando acceder a LeerNombre() y LeerEdad() que son publicas, no debería necesitar colocar friend... es que acaso friend con el operador trabaja de forma distinta?

Gracias de antemano.
153  Programación / Programación C/C++ / Re: Punteros fantasmas... (asi le puse yo).. en: 13 Febrero 2019, 04:28 am
No te entendi, cual es el valor que se pierde que había asignado antes?..

EDIT:

Ah!, te refieres a que no debí haber escrito :

Código
  1. int * punteroSuma = new int;

sino:

Código
  1. int * punteroSuma = sumar(a, b);

directamente, verdad?...

Es como que cuando solicité memoria al declarar punteroSuma, esa memoria la dejé botada y pasé el puntero al valor de retorno de Suma.. creo que a eso te refieres...

154  Programación / Programación C/C++ / Re: Punteros fantasmas... (asi le puse yo).. en: 12 Febrero 2019, 02:18 am
Perfecto, y esos dos últimos que mencionaste (unique_ptr y shared_ptr) serian punteros inteligentes no ?..
155  Programación / Programación C/C++ / Re: Punteros fantasmas... (asi le puse yo).. en: 11 Febrero 2019, 21:54 pm
entiendo, entiendo...

tengo que imaginar al delete como un interruptor que desactiva el espacio de memoria
y al new como que lo activa..  podría ser así la abstracción.

Gracias nuevamente!! : :o :)
156  Programación / Programación C/C++ / Re: Punteros fantasmas... (asi le puse yo).. en: 11 Febrero 2019, 18:59 pm
Gracias por las respuestas a ambos.. me ha quedado mucho mas claro ahora con lo ultimo que han dicho..

Una ultima duda:

Código
  1.  
  2. int * sumar(int a, int b){
  3.     int * psuma = new int;
  4.     *psuma = a + b;
  5.     return psuma;
  6.  
  7. }
  8.  
  9. int main (){
  10.     int a = 5;
  11.     int b = 10;
  12.  
  13.     int * psuma = new int;    //duda con el nombre psuma
  14.     psuma = sumar(a, b);
  15.  
  16.     delete psuma;                //aqui se elimina psuma, pero cual?, el declarado
  17.                                         //en main solamente o los dos?
  18.  
  19. }
  20.  
  21.  

Que pasa en el siguiente caso ?

Código
  1.  
  2. int * sumar(int a, int b){
  3.     int * psuma = new int;
  4.     *psuma = a + b;
  5.     return psuma;
  6.  
  7. }
  8.  
  9. int main (){
  10.     int a = 5;
  11.     int b = 10;
  12.  
  13.     int * punteroSuma = new int;    //modificado el nombre
  14.     punteroSuma = sumar(a, b);
  15.  
  16.     delete punteroSuma;      //aqui se elimina psuma, punteroSuma o ambos?
  17. }
  18.  
  19.  


Gracias!
157  Programación / Programación C/C++ / Re: Punteros fantasmas... (asi le puse yo).. en: 11 Febrero 2019, 16:03 pm
Loretz, el codigo que pusiste funciona, entonoces tengo un caos en la cabeza jaja...
Cuando retorna un valor puntero o un valor comun y silvestre no se pierde el valor retornado, entonoces qué pasa con la variable declarada dentro de la funcion?.. no se destruye?...

Lo digo porque, en el caso de retornar un int, supongo que pasaría una copia y no sería problema, pero cuando retornas un int * no estarías retornando una copia... estarias retornando un puntero a la declaracion hecha dentro de la funcion...

158  Programación / Programación C/C++ / Re: Punteros fantasmas... (asi le puse yo).. en: 11 Febrero 2019, 00:27 am
Entiendo.  Pero es lógico que un puntero al ser creado dentro de una función e intentar devolverlo no sirve de nada?.. eso pienso yo, el puntero queda vacío, sin valor.. y cuando se quiera usar como valor retornado no apuntará a ninguna parte...  es asi?
159  Programación / Programación C/C++ / Re: Llevo 1 año estudiando C++ aprox., y aún no hallo sentido a los punteros.. en: 11 Febrero 2019, 00:24 am
Gracias por las respuestas, tendré que enfocarme en qué y cuando usar punteros, lo que pasa es que en mi afán de querer usarlos, cometo errores, típicamente cuando aprendo algo nuevo, me dan ganas de usar ese algo a la fuerza, y no debería pensar asi..

saludos.
160  Programación / Programación C/C++ / Punteros fantasmas... (asi le puse yo).. en: 10 Febrero 2019, 22:43 pm
Hola!
Me he topado con el siguiente escenario:

Código
  1.  
  2. //En este fragmento al terminar la función, se destruye el contenido de suma y retorna null o vacío, y el puntero suma sigue existiendo en memoria....
  3. int RetornaUnaSuma(int a, int b){
  4.  
  5.     int * suma = new int;
  6.     *suma = a+b;
  7.     return *suma;
  8. }
  9.  
  10. //Aqui intento retornar un puntero creado dentro de la misma función...
  11. int * RetornaUnaSuma(int a, int b){
  12.  
  13.     int * suma = new int;
  14.     *suma = a+b;
  15.     return suma;
  16.  
  17.     //pero al terminar la función, se destruye el contenido y retorna una dirección de memoria sin contenido, el puntero sigue existiendo..
  18. }
  19.  
  20.  

Según yo es mala práctica declarar punteros que quieras retomar dentro de una función o un ámbito...  bueno aparte de mala practica no funciona el retorno...Es como lo pienso?...

Probablemente se pueda devolver punteros cuando éstos mismos ingresan como argumento...

La función sería:

Código
  1. //Segun yo esto debe funcionar...
  2. int * RetornaUnaSuma(int * pSuma, int a, int b){
  3.  
  4.     *pSuma = a+b;
  5.     return pSuma;
  6.  
  7. }
  8.  


Que opinan...
Saludos.
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