• Domingo 28 de Abril de 2024, 19:56

Autor Tema:  Copy Constructor  (Leído 4569 veces)

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Copy Constructor
« en: Sábado 28 de Abril de 2007, 14:08 »
0
Me surgio una duda al ver este codigo.

Código: Text
  1.       class B    //With copy constructor
  2.       {
  3.            private:
  4.            char *name;
  5.            public:
  6.            B()
  7.            {
  8.            name = new char[20];
  9.            }
  10.            ~B()
  11.            {
  12.            delete name[];
  13.            }
  14.      //Copy constructor
  15.            B(const B &b)
  16.            {
  17.            name = new char[20];
  18.            strcpy(name, b.name);
  19.            }
  20.       };
  21.  

Con respecto al constructor de copia se esta pasando como argumento de la funcion strcpy un miembro privado de un objeto, es legal esto?

Karman

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
    • http://www.inexinferis.com.ar
Re: Copy Constructor
« Respuesta #1 en: Sábado 28 de Abril de 2007, 19:40 »
0
si porque es una variable de la misma clase, aunque no lo sea del mismo objeto...

S2

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Copy Constructor
« Respuesta #2 en: Domingo 29 de Abril de 2007, 01:13 »
0
sigo sin entender. :(

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Copy Constructor
« Respuesta #3 en: Domingo 29 de Abril de 2007, 09:06 »
0
Primero vamos a la practica: ¿Compila? Si. ¿Funciona? Perfectamente. Es legal.

Ahora veamos un poco de teoria (directamente "choreada" de un libro de C++, si lo quieren dare referencias):

"Hay tres tipos de accesos a miembros de clases:

privados: (si se antepone el identificador private). No son accesibles desde el exterior de la clase. Estos miembros estan encapsulados y su uso es a traves de los metodos."

Una demostracion:
Código: Text
  1.  
  2. int legal(const B &b)
  3. {
  4.   *b.name = 0;
  5. }
  6.  
  7.  

Si agregas este metodo dentro de la clase B es perfectamente valido, compila y funciona mientras que si lo pones afuera VC++ te da el siguiente error:
error C2248: 'B::name' : cannot access private member declared in class 'B'

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Copy Constructor
« Respuesta #4 en: Domingo 29 de Abril de 2007, 14:59 »
0
y que parte pertenece a la clase y que parte pertenece al objeto cuando creo un objeto? porque b es un objeto de la clase B, pero ya es un objeto, o sea es externa a la clase o no?

PD: este tema no lo entendi nunca bien como es en realidad.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Copy Constructor
« Respuesta #5 en: Domingo 29 de Abril de 2007, 15:12 »
0
Otra vez a la logica: ¿Acaso el constructor de copia lo estas definiendo afuera de la clase? ¿Es externo entonces?

Un objeto es una instancia de una clase (memoria donde albergar todos los atributos de una clase).

PD. Mejor leete algo como esto:
http://en.wikipedia.org/wiki/Object-oriented_programming

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Copy Constructor
« Respuesta #6 en: Domingo 29 de Abril de 2007, 16:33 »
0
yo lo que entiendo es que se puede modificar los atributos privados de la clase desde sus propias funciones en este caso seria this->name, pero ya cuando una de sus funciones recibe como parametro un objeto determinado, en este caso de la misma clase esta accediendo a miembros privados de un objeto que es de la misma clase.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Copy Constructor
« Respuesta #7 en: Domingo 29 de Abril de 2007, 16:45 »
0
Cita de: "AnioN"
yo lo que entiendo es que se puede modificar los atributos privados de la clase desde sus propias funciones en este caso seria this->name, pero ya cuando una de sus funciones recibe como parametro un objeto determinado, en este caso de la misma clase esta accediendo a miembros privados de un objeto que es de la misma clase.
Esto es TODO el tiempo una misma clase: B.

Si intentas acceder a name desde una funcion que no sea de la clase B entonces no vas a poder (esta haciendo lo que dice el enunciado, los miembros de tipo private solo son accesibles desde la misma CLASE), ya te di el codigo con el ejemplo y el error al compilar que genera el VC++.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Copy Constructor
« Respuesta #8 en: Domingo 29 de Abril de 2007, 17:25 »
0
a ver mas o menos si voy entendiendo como es el tema.

Código: Text
  1. #include <iostream>
  2.  
  3. class A {
  4.   public:
  5.     void aa(A s) {
  6.             a = 10;
  7.             s.a = 10;
  8.             std::cout <<"contenido de a: = " << a << std::endl;
  9.             std::cout <<"contenido de s.a = " << s.a << std::endl;
  10.     }
  11.   private:
  12.     int a;
  13. };
  14.  
  15.  
  16. int main()
  17. {
  18.     A d;
  19.     A f;
  20.     d.aa(f);
  21.  
  22.   return 0;
  23. }
  24.  

Yo tengo dos objetos de la clase A, a uno de los objetos le paso como parametro el otro objeto y puedo modificar las propiedades privadas del mismo porque pertenecen a la misma clase?
La forma en que lo veo ahora es como que cada objeto que creo es independiente de la clase de la cual se cree, por lo tanto me parecia que son dos objetos que no tienen nada en comun uno con el otro,  pero al parece no es asi.

Existe alguna analogia con el mundo real que se use de ejemplo para que me sirva para entenderlo mejor?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Copy Constructor
« Respuesta #9 en: Domingo 29 de Abril de 2007, 17:52 »
0
Cita de: "AnioN"
Yo tengo dos objetos de la clase A, a uno de los objetos le paso como parametro el otro objeto y puedo modificar las propiedades privadas del mismo porque pertenecen a la misma clase?

Si, si usaras eso desde otra clase o una funcion daria error. ¿Los niveles de proteccion son de clases o de objetos? Respondiendo esa pregunta podras despejar la duda original.

Cita de: "AnioN"
La forma en que lo veo ahora es como que cada objeto que creo es independiente de la clase de la cual se cree, por lo tanto me parecia que son dos objetos que no tienen nada en comun uno con el otro,  pero al parece no es asi.

Una clase es una descripcion abstracta y cada objeto es una instancia de esta clase, tienen en comun todos los metodos para empezar, la ubicacion de cada uno de sus miembros es exactamente la misma por simple logica.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Copy Constructor
« Respuesta #10 en: Domingo 29 de Abril de 2007, 18:31 »
0
Citar
a que te referis con mienbros?, a los atributos o a los metodos?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Copy Constructor
« Respuesta #11 en: Domingo 29 de Abril de 2007, 18:43 »
0
Cita de: "AnioN"
a que te referis con mienbros?, a los atributos o a los metodos?
Ambos (aunque de diferente manera), en cuanto a los atributos siempre estaran en direccion base del objeto + offset al miembro y los metodos (en general, no pienso entrar en dynamic binding) todos en la seccion de codigo.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Copy Constructor
« Respuesta #12 en: Domingo 29 de Abril de 2007, 18:45 »
0
Citar
¿Los niveles de proteccion son de clases o de objetos? Respondiendo esa pregunta podras despejar la duda original.
cual es la respuesta?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Copy Constructor
« Respuesta #13 en: Domingo 29 de Abril de 2007, 18:47 »
0
Cita de: "AnioN"
cual es la respuesta?
Clases:
"Hay tres tipos de accesos a miembros de clases".

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Copy Constructor
« Respuesta #14 en: Domingo 29 de Abril de 2007, 18:51 »
0
y por que cuando creo un objeto en el main solo puedo acceder a los miembros publicos solamente?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Copy Constructor
« Respuesta #15 en: Domingo 29 de Abril de 2007, 18:53 »
0
Cita de: "AnioN"
y por que cuando creo un objeto en el main solo puedo acceder a los miembros publicos solamente?
¿El main es parte de la clase o es una funcion totalmente ajena?

"privados: (si se antepone el identificador private). No son accesibles desde el exterior de la clase. Estos miembros estan encapsulados y su uso es a traves de los metodos.""

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Copy Constructor
« Respuesta #16 en: Domingo 29 de Abril de 2007, 21:17 »
0
ya me esta cerrando el tema. Muchas gracias. :)

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Copy Constructor
« Respuesta #17 en: Domingo 29 de Abril de 2007, 21:19 »
0
Cita de: "AnioN"
ya me esta cerrando el tema. Muchas gracias. :)
Me alegro y de nadas  B)  :kicking:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Copy Constructor
« Respuesta #18 en: Lunes 30 de Abril de 2007, 01:29 »
0
o sea, en definitiva el "secreto" de la OOP es ver el ambito donde se esta trabajando para poder saber si se puede acceder a un miembro determinado o no?.

Yo de la forma que lo veia es ver a los objetos sin importar la clase de la que provienen y los modificadores de acceso relacionados con los objetos. Ahora por fin estoy empezando a entender como es este paradigma. Veia como la encapsulacion se referia a cada objeto como una especie de "cajita" que este donde este no se puede modificar su parte privada.

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Copy Constructor
« Respuesta #19 en: Lunes 30 de Abril de 2007, 01:38 »
0
existe alguna analogia con el mundo real para relacion a las clases, objetos y modificadores de acceso que se use en forma habitual?, lo pregunto porque soy autodidacta y se complica a veces captar estos conceptos abstractos.

Karman

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
    • http://www.inexinferis.com.ar
Re: Copy Constructor
« Respuesta #20 en: Lunes 30 de Abril de 2007, 02:32 »
0
un ejemplo? imaginate una casa (clase), en la que viven personas (objetos), los objetos  (personas) pueden acceder a la casa(clase) en la que viven y modificar sus atributos(piezas por ejemplo), mientras que las personas externas (otros objetos o funciones externos a la clase) solo pueden acceder a ella a travez de los dueños (en la vida real uno invita al otro a que pase... pero pasalo por alto... jo), pero a su vez, las personas que la habitan(objetos) pueden modificar atributos de los demás habitantes de la casa(los otros objetos) siempre que le dejen hacerlo (de como implementes los métodos), es un poco colgado... pero con una de pastillas :P  se entiende mi ejemplo... jo  :kicking:

S2

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Copy Constructor
« Respuesta #21 en: Lunes 30 de Abril de 2007, 22:20 »
0
ejejeje, esta bueno el ejemplo. :)

Max_D

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
    • http://sitioteca.spaces.live.com/
Re: Copy Constructor
« Respuesta #22 en: Martes 1 de Mayo de 2007, 16:11 »
0
Ejemplo claro:

Una bloque de pisos (programa), tiene sus viviendas (objetos), que se basan en un plano (clase).