Alguien me ayuda con esta duda? Funciones & Punteros.

Iniciado por XorNet, 4 Octubre 2013, 06:54 AM

0 Miembros y 1 Visitante están viendo este tema.

XorNet

Hola bueno es que me puse a revisar un código fuente y pues me tope con unas lineas así:
Código (cpp) [Seleccionar]

ZGetGame()->ZMyCharacter();
//También con:
ZCharacter()->GetMaxAP;


No entiendo por el simple echo de que son funciones con operador flecha apuntando hacia otra función o otra variable, o sea no sé si me explique, si alguien me puede poner un ejemplo fácil de comprender y una explicación, porque la verdad estoy muy ansioso por aprender esto los he visto en casi todo el código y pues *Emoción* xD

eferion

A ver, tu tienes una estructura o clase cualquiera:


struct estructura
{
  void (*FuncPtr)();
};


Y por otro lado tienes una función que devuelve un puntero a una estructura de este tipo:


struct structura* Funcion( );


Si quieres acceder a algún miembro de la estructura, dado que es puntero tienes que utilizar el operador '->'. Si devolviese la estructura por valor en vez de por referencia tendrías que utilizar el operador '.' para acceder a los miembros de la estructura.

Si, en concreto, quieres acceder al puntero a función almacenado en la estructura, dicho acceso puede escribirse así:


// primera forma:
Funcion( )->FuncPtr( );

// segunda forma:
struct estructura* p_estructura = Funcion( );
p_estructura->FuncPtr( );


Pero vamos, que antes de correr tanto ponte a aprender la base, que estas cosas ya irán llegando solas.

Un saludo.

XorNet

Cita de: eferion en  4 Octubre 2013, 08:25 AM
A ver, tu tienes una estructura o clase cualquiera:


struct estructura
{
  void (*FuncPtr)();
};


Y por otro lado tienes una función que devuelve un puntero a una estructura de este tipo:


struct structura* Funcion( );


Si quieres acceder a algún miembro de la estructura, dado que es puntero tienes que utilizar el operador '->'. Si devolviese la estructura por valor en vez de por referencia tendrías que utilizar el operador '.' para acceder a los miembros de la estructura.

Si, en concreto, quieres acceder al puntero a función almacenado en la estructura, dicho acceso puede escribirse así:


// primera forma:
Funcion( )->FuncPtr( );

// segunda forma:
struct estructura* p_estructura = Funcion( );
p_estructura->FuncPtr( );


Pero vamos, que antes de correr tanto ponte a aprender la base, que estas cosas ya irán llegando solas.

Un saludo.

Oye y este método cómo se llama? O sea que nombre se  le da a este tipo de instrucciones, me explico a las funciones así:
Código (cpp) [Seleccionar]

void funcion1(int prueba, ...);

Se les denomina Funciones Variadicas, entonces cómo se le denomina a esto que trato de entender?

rir3760

Cita de: XorNet en  4 Octubre 2013, 15:52 PMcómo se le denomina a esto que trato de entender?
Es solo una función que retorna un puntero, no tiene un nombre especial.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

ivancea96

Sencillamente, si tienes un objeto de una clase en u variable, lo llamas con "clase.funcion/variable". Si el estás tratando con un puntero a esa clase, es con "clase->funcion/variable".
Por cierto,
Cita de: XorNet en  4 Octubre 2013, 15:52 PM
Se les denomina Funciones Variadicas
Función Variadica? De donde sacaste eso?
En mi vida lo oí xD

rir3760

Cita de: ivancea96 en  4 Octubre 2013, 16:15 PMPor cierto,Función Variadica? De donde sacaste eso?
En mi vida lo oí
Son las funciones que reciben un numero variable de argumentos, por ejemplo printf o scanf. Mas información en la pagina (cortesía de Wikipedia) Variadic function.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

ivancea96

Ah, al ponerle la 'a' no me fijé xD
Nunca usé esa librería la verdad.
Prefiero usar sobrecarga.

XorNet

Bueno hasta ahora he tratado de entender pero pues no lo he logrado xd, cuando trato de compilar esto:
Código (cpp) [Seleccionar]

#include <iostream>

using namespace std;

class Prueba {
public:
void saludo() { cout << "Saludo desde la función!\n"; }
Prueba() { }
};

int main() {
Prueba* pPrueba( );

pPrueba()->saludo();

system("pause>nul");

return 0;
}

Pero me da error, alguien me dice porque? Es obvio que lo estoy haciendo super mal pero por eso pongo el código para saber porque y me orienten.

eferion

Código (cpp) [Seleccionar]
Prueba* pPrueba( );

Esta línea está mal.

Los objetos se pueden crear, bien de forma estática:

Código (cpp) [Seleccionar]

Prueba pPrueba( );


Bien de forma dinámica:

Código (cpp) [Seleccionar]

Prueba* pPrueba = new Prueba( );


Pero lo que tu has puesto es una forma híbrida que no funciona.

Por cierto, si creas un objeto con new... recuerda que has de poner un delete cuando dejes de usarlo... si no vas a dejar tu programa plagado de lagunas de memoria.

Código (cpp) [Seleccionar]

int main() {
Prueba* pPrueba = new Prueba( );

pPrueba()->saludo();

        delete pPrueba( );

system("pause>nul");

return 0;
}

ivancea96

2 cosas:

1)
Código (cpp) [Seleccionar]
Prueba* pPrueba = new Prueba();
Eso solo era un puntero. Tienes que asignarle una variable. (new ...)

2) Pusiste "pPrueba()->saludo();
La variable no tiene paréntesis.