PDA

Ver la versión completa : c++ <- paso de parámetros



pakoito
03/06/2008, 17:46
Quiero pasar una función por valor, referencia y por direccionamiento.

Valor (clase cl)
Referencia (clase &cl)

pero no sabemos como cuyons se hace por direccionamiento. Resolución rápida plis.

DarkDijkstra
03/06/2008, 17:52
no se si te entiendo bien del todo... pero lo que quieres es pasar un puntero, no?

Direccionamiento (clase* cl)

pakoito
03/06/2008, 18:09
D'accord. &#191;Y para llamar a la funci&#243;n? &#191;y el funcionamiento dentro de la funci&#243;n de esa clase?

DarkDijkstra
03/06/2008, 18:29
Puesss, vamos a ver, pongamos que tenemos dos clases, A y B



Class A
{
public:
int value;
};

Class B
{
public:
void function1(A a);
void function2(A& a);
void function3(A* a);
};


y luego, dentro de la especificaci&#243;n de la clase B:




void B::function1(A a)
{
a.value++;
}

void B::function2(A& a)
{
a.value++;
}

void B::function3(A* a)
{
a->value++;
// o lo que es lo mismo
// (*a).value++;
}


y luego ya en tu "main" o donde fuese, podr&#237;as tener...




A a;
B b;
a.value = 42;

b.function1(a);
cout << a.value << endl;
b.function2(a);
cout << a.value << endl;
b.function3(&a);
cout << a.value << endl;


(la salida del programa ser&#237;a "42,43,44" si no me he patinado)

dentro de la clase B tienes tres m&#233;todos que aceptan distintos par&#225;metros...
- el primero acepta un objeto de la clase A
- el segundo acepta una referencia a un objeto de la clase A
- el tercero acepta un puntero a un objeto de la clase A

todos los m&#233;todos aparentemente hacen lo mismo, incrementar el atributo "value" del par&#225;metro

el resultado es "42,43,44" en vez de "43,44,45"... por que?

la movida es que en function1, el hecho de incrementar el valor NO es permanente, ya que realmente lo que le estas pasando por par&#225;metro es una copia del objeto "a" (con la consiguiente necesidad de memoria y tiempo de crear la copia), en function2 est&#225;s pasando una referencia al objeto "a", es decir, una especie de "manejador" que te permite modificarlo y tal y no requiere hacer una copia, en function3 le est&#225;s pasando un puntero al objeto y se consigue m&#225;s o menos lo mismo que con function2

en C no existen las referencias pero si los punteros, en C++ metieron las referencias para que fuesen una especie de "punteros" m&#225;s sencillos de usar

no se si realmente te he liado m&#225;s o si ya sab&#237;as todo esto... : S

pakoito
03/06/2008, 18:35
Muchas gracias, muy bien explicadito, claro y limpio ^^

DarkDijkstra
03/06/2008, 18:38
No es sarc&#225;stico?
No me creo que una de mis explicaciones sea clara y limpia XD

pakoito
03/06/2008, 18:44
Yo se lo que es valor, referencia y me faltaba direccionamiento, que el caso es que lo he usado pero no lo he llamado asi. Casi me cargan una pr&#225;ctica por usar los . en vez de ->

Y si, est&#225; muy claro porque se lo he pasado a un compa&#241;ero que era al que m&#225;s falta le hac&#237;a y lo ha entendido a la primera ;)

< - >
Por cierto, hay ambig&#252;edad entre valor y referencia por lo que veo. Edita el c&#243;digo y pon a cada funci&#243;n su nombre que estoy usando tu post de ejemplo para la clase ^^

swapd0
03/06/2008, 23:57
Un consejo, usar referencias es programar mas al estilo C++ que usando punteros. Y que no se te olvide poner 'const' en caso de que no se modifique, queda mas claro el codigo.

pakoito
04/06/2008, 00:19
&#161;&#161;&#161;Asi que para eso era los const!!! &#161;Toda la tarde comi&#233;ndome el coco! &#161;&#161;Gracias!!!

< - >
Dec&#237;a yo para que co&#241;o meterlo por referencia si quiero valor...no es mas f&#225;cil poner valor directamente. Y cuando se declara al final de la funci&#243;n para no alterar los atributos ya me part&#237;a el ojal...


Es lo que tiene estudiar una asignatura sin tener apuntes, que tiras de donde no hay xDDD Como aprob&#233; las pr&#225;cticas con lo que sab&#237;a de java me pens&#233; que todo el monte era or&#233;gano.

hardyx
04/06/2008, 10:05
Pakoito, si pasas un entero por valor por ejemplo y lo cambias dentro de la funci&#243;n, por fuera en la funci&#243;n que lo llama no se entera, ya que se hace una copia local. Por eso se pasa por "direccionamiento" con un puntero los par&#225;metros que quieres cambiar. Esto es en C.

Luego en C++ dijeron es un rollo lo de los punteros con la flecha, y se inventaron los par&#225;metros por referencia, que es el estilo de Pascal. Lo que pasa es que con esto no sabes si cambiar&#225; o no el par&#225;metro, por eso se usa const para aclararlo.

pakoito
04/06/2008, 14:18
Pakoito, si pasas un entero por valor por ejemplo y lo cambias dentro de la funci&#243;n, por fuera en la funci&#243;n que lo llama no se entera, ya que se hace una copia local. Por eso se pasa por "direccionamiento" con un puntero los par&#225;metros que quieres cambiar. Esto es en C.
Gracias hombre, pero eso ya lo ten&#237;a claro en primero de carrera, me fallaba el cambio a c++ xDDD