SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: AnioN en Sábado 28 de Abril de 2007, 14:08

Título: Copy Constructor
Publicado por: AnioN en Sábado 28 de Abril de 2007, 14:08
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?
Título: Re: Copy Constructor
Publicado por: Karman en Sábado 28 de Abril de 2007, 19:40
si porque es una variable de la misma clase, aunque no lo sea del mismo objeto...

S2
Título: Re: Copy Constructor
Publicado por: AnioN en Domingo 29 de Abril de 2007, 01:13
sigo sin entender. :(
Título: Re: Copy Constructor
Publicado por: Eternal Idol en Domingo 29 de Abril de 2007, 09:06
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'
Título: Re: Copy Constructor
Publicado por: AnioN en Domingo 29 de Abril de 2007, 14:59
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.
Título: Re: Copy Constructor
Publicado por: Eternal Idol en Domingo 29 de Abril de 2007, 15:12
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 (http://en.wikipedia.org/wiki/Object-oriented_programming)
Título: Re: Copy Constructor
Publicado por: AnioN en Domingo 29 de Abril de 2007, 16:33
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.
Título: Re: Copy Constructor
Publicado por: Eternal Idol en Domingo 29 de Abril de 2007, 16:45
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++.
Título: Re: Copy Constructor
Publicado por: AnioN en Domingo 29 de Abril de 2007, 17:25
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?
Título: Re: Copy Constructor
Publicado por: Eternal Idol en Domingo 29 de Abril de 2007, 17:52
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.
Título: Re: Copy Constructor
Publicado por: AnioN en Domingo 29 de Abril de 2007, 18:31
Citar
a que te referis con mienbros?, a los atributos o a los metodos?
Título: Re: Copy Constructor
Publicado por: Eternal Idol en Domingo 29 de Abril de 2007, 18:43
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.
Título: Re: Copy Constructor
Publicado por: AnioN en Domingo 29 de Abril de 2007, 18:45
Citar
¿Los niveles de proteccion son de clases o de objetos? Respondiendo esa pregunta podras despejar la duda original.
cual es la respuesta?
Título: Re: Copy Constructor
Publicado por: Eternal Idol en Domingo 29 de Abril de 2007, 18:47
Cita de: "AnioN"
cual es la respuesta?
Clases:
"Hay tres tipos de accesos a miembros de clases".
Título: Re: Copy Constructor
Publicado por: AnioN en Domingo 29 de Abril de 2007, 18:51
y por que cuando creo un objeto en el main solo puedo acceder a los miembros publicos solamente?
Título: Re: Copy Constructor
Publicado por: Eternal Idol en Domingo 29 de Abril de 2007, 18:53
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.""
Título: Re: Copy Constructor
Publicado por: AnioN en Domingo 29 de Abril de 2007, 21:17
ya me esta cerrando el tema. Muchas gracias. :)
Título: Re: Copy Constructor
Publicado por: Eternal Idol en Domingo 29 de Abril de 2007, 21:19
Cita de: "AnioN"
ya me esta cerrando el tema. Muchas gracias. :)
Me alegro y de nadas  B)  :kicking:
Título: Re: Copy Constructor
Publicado por: AnioN en Lunes 30 de Abril de 2007, 01:29
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.
Título: Re: Copy Constructor
Publicado por: AnioN en Lunes 30 de Abril de 2007, 01:38
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.
Título: Re: Copy Constructor
Publicado por: Karman en Lunes 30 de Abril de 2007, 02:32
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
Título: Re: Copy Constructor
Publicado por: AnioN en Lunes 30 de Abril de 2007, 22:20
ejejeje, esta bueno el ejemplo. :)
Título: Re: Copy Constructor
Publicado por: Max_D en Martes 1 de Mayo de 2007, 16:11
Ejemplo claro:

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