Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Zodiak98 en 11 Julio 2013, 04:56 am



Título: [Duda] Funciones
Publicado por: Zodiak98 en 11 Julio 2013, 04:56 am
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
  1. if( !GetLocatorDBMgr()->GetBlockCountryCodeList(bcl) )
  2. {
  3. DeleteCountryFilter();
  4. mlog( "Fail to Init BlockCountryCode.\n" );
  5. return false;
  6. }
  7.  
  8. if( !GetLocatorDBMgr()->GetCustomIPList(cil) )
  9. {
  10. DeleteCountryFilter();
  11. mlog( "Fail to Init CustomIPList.\n" );
  12. return false;
  13. }
  14.  

Como pueden notar en las lineas:
Código
  1. if( !GetLocatorDBMgr()->GetBlockCountryCodeList(bcl) )
  2. if( !GetLocatorDBMgr()->GetCustomIPList(cil) )
  3.  
  4. /*
  5. 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?
  6. */
  7.  


Título: Re: [Duda] Funciones
Publicado por: 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
  1. class poo
  2. {
  3.  public:
  4.    int a;
  5. };
  6.  
  7. poo* func( );
  8.  
  9. int main( ... )
  10. {
  11.  // ...
  12.  
  13.  func( )->a = 7;
  14. }

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.



Título: Re: [Duda] Funciones
Publicado por: amchacon en 11 Julio 2013, 10:20 am
Las funciones no tienen operadores de indirección.
Las funciones no, pero un puntero a una clase sí  ;)


Título: Re: [Duda] Funciones
Publicado por: Zodiak98 en 11 Julio 2013, 19:26 pm
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
  1. class poo
  2. {
  3.  public:
  4.    int a;
  5. };
  6.  
  7. poo* func( );
  8.  
  9. int main( ... )
  10. {
  11.  // ...
  12.  
  13.  func( )->a = 7;
  14. }

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.


Título: Re: [Duda] Funciones
Publicado por: rir3760 en 12 Julio 2013, 03:48 am
Las 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:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int (*p)(char const *);
  7.  
  8.   p = puts;
  9.   p("Linea 1");
  10.   (*p)("Linea 2");
  11.  
  12.   p = &puts;
  13.     (*p)("Linea 3");
  14.    (**p)("Linea 4");
  15.   (***p)("Linea 5");
  16.  
  17.   return EXIT_SUCCESS;
  18. }
Es valido.

----

Y 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.

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.
No. Tienes que revisar la expresión por partes. Si tomamos el ejemplo de eferion, la sentencia en cuestión es:
Código
  1. 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


Título: Re: [Duda] Funciones
Publicado por: eferion en 12 Julio 2013, 09:21 am
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
  1. class poo
  2. {
  3.  public:
  4.  
  5.    // ...
  6.  
  7.     std::string* Cadena( )
  8.     { return _string; }
  9.  
  10.    // ...
  11.  
  12.  private:
  13.  
  14.    std::string* _string;
  15. }

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.

Código:
int main( ... )
{
  poo clase;

 // ...

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

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

  // ...
}