[Duda] Funciones

Iniciado por Zodiak98, 11 Julio 2013, 04:56 AM

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

Zodiak98

Bueno es qué me puse a trabajar con un source enorme de un mmorpg para tratar de desarrollar conocimiento sobre este lenguaje pero a medida qué lo veia me encontre con estos 2 condicionales:

Código (cpp) [Seleccionar]

if( !GetLocatorDBMgr()->GetBlockCountryCodeList(bcl) )
{
DeleteCountryFilter();
mlog( "Fail to Init BlockCountryCode.\n" );
return false;
}

if( !GetLocatorDBMgr()->GetCustomIPList(cil) )
{
DeleteCountryFilter();
mlog( "Fail to Init CustomIPList.\n" );
return false;
}


Como pueden notar en las lineas:
Código (cpp) [Seleccionar]

if( !GetLocatorDBMgr()->GetBlockCountryCodeList(bcl) )
if( !GetLocatorDBMgr()->GetCustomIPList(cil) )

/*
El GetLocatorDBMgr() asumo qué por tener paréntesis en una función pero porqué una función tiene el operador de indirección de punteros (->) ? Alguien me explica esto?
*/


eferion

Las funciones no tienen operadores de indirección.

Lo que sucede es que una función puede devolver algo... y ese algo si puede tener operadores de indirección o, directamente, ser un puntero.

Ejemplo:

Código (cpp) [Seleccionar]

class poo
{
  public:
    int a;
};

poo* func( );

int main( ... )
{
  // ...
 
  func( )->a = 7;
}


De todas formas, visto tu nivel te recomiendo empezar con cosas más sencillas... conseguirás metas más fácilmente y eso te motivará más que lo que estás intentando hacer ahora.


amchacon

Cita de: eferion en 11 Julio 2013, 08:20 AMLas funciones no tienen operadores de indirección.
Las funciones no, pero un puntero a una clase sí  ;)
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Zodiak98

Cita de: eferion en 11 Julio 2013, 08:20 AM
Las funciones no tienen operadores de indirección.

Lo que sucede es que una función puede devolver algo... y ese algo si puede tener operadores de indirección o, directamente, ser un puntero.

Ejemplo:

Código (cpp) [Seleccionar]

class poo
{
  public:
    int a;
};

poo* func( );

int main( ... )
{
  // ...
 
  func( )->a = 7;
}


De todas formas, visto tu nivel te recomiendo empezar con cosas más sencillas... conseguirás metas más fácilmente y eso te motivará más que lo que estás intentando hacer ahora.



Y cual es la diferencia entre hacerlo con paréntesis y sin paréntesis ?
Por lo qué pude ver los qué tienen paréntesis son punteros qué no apuntan hacía ningún otro objeto si no hacía los datos miembros de la clase.

rir3760

Cita de: eferion en 11 Julio 2013, 08:20 AMLas funciones no tienen operadores de indirección.
Desconozco cual sea el caso en C++ pero en C es posible (y confuso) aplicar (o no, es al gusto) los operadores de indirecion y "dirección de" en el caso de funciones. Por ejemplo este programa:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int (*p)(char const *);
   
   p = puts;
   p("Linea 1");
   (*p)("Linea 2");
   
   p = &puts;
     (*p)("Linea 3");
    (**p)("Linea 4");
   (***p)("Linea 5");
   
   return EXIT_SUCCESS;
}

Es valido.

----

Cita de: Zodiak98 en 11 Julio 2013, 19:26 PMY cual es la diferencia entre hacerlo con paréntesis y sin paréntesis ?
Esto tienes que explicarlo mejor ya que todos los ejemplos hasta el momento involucran llamadas a función y, por ende, paréntesis.

Cita de: Zodiak98 en 11 Julio 2013, 19:26 PMPor lo qué pude ver los qué tienen paréntesis son punteros qué no apuntan hacía ningún otro objeto si no hacía los datos miembros de la clase.
No. Tienes que revisar la expresión por partes. Si tomamos el ejemplo de eferion, la sentencia en cuestión es:
Código (cpp) [Seleccionar]
func()->a = 7;

Los pasos al evaluar la expresión son:

1) La llamada a función "func()" resulta en un puntero de tipo "poo *".

2) Cuando se trabaja con punteros a estructuras o clases se puede utilizar el operador "->" para aplicar indireccion y acceder al campo indicado (a la derecha del operador y en este caso de nombre "a").

3) En el mentado campo (indicado por el paso anterior) se almacena el valor 7.

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

eferion

Cita de: Zodiak98 en 11 Julio 2013, 19:26 PM
Y cual es la diferencia entre hacerlo con paréntesis y sin paréntesis ?
Por lo qué pude ver los qué tienen paréntesis son punteros qué no apuntan hacía ningún otro objeto si no hacía los datos miembros de la clase.

Pues a ver, si tu tienes

Código (cpp) [Seleccionar]

class poo
{
  public:

    // ...

     std::string* Cadena( )
     { return _string; }

    // ...

  private:

    std::string* _string;
}


Y deseas recuperar el puntero a la cadena forzosamente tienes que llamar a la función Cadena. Hacer esa llamada te va a retornar un puntero que puedes usar inmediatamente dentro de la misma instrucción.


int main( ... )
{
  poo clase;

// ...

  // Esto ...
  int length = clase.Cadena( )->length( );

  // ... es equivalente a ...
  std::string* cadena = clase.Cadena( );
  int length = cadena->length( );

  // ...
}