oerador de ambito :: o doble dos puntos

Iniciado por dewolo, 10 Octubre 2011, 03:12 AM

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

dewolo

http://www.zator.com/Cpp/E4_9_19.htm
http://www.hackingballz.com/herramientas/manual-oficial-de-php/language.oop5.paamayim-nekudotayim.html

hola, mirando unos codigos mesurgio una duda sobre un operador que nunca me enseniaron completamente, es el doble dos puntos, por ejemplo en el compilador dentro del main si pongo
"::" sale un cartel con algunas opciones, pero en otros codigos mas precisamente en codigos de clases personalizadas, he visto como se llaman a funciones de windows usando ese operador, quisiera saber para que se hace esto, nunca lo supe  :-[
por ahi es algo tonto pero no me lo enseniaron  :¬¬



Uploaded with ImageShack.us

unos ejemplos que encontree


bool CAppGetReso::OnInit()
{
    //! Initialize all image handlers.
    ::wxInitAllImageHandlers();

    //~ Initialize all XRC handlers.
    wxXmlResource::Get()->InitAllHandlers();

    //~ Return true to continue processing.
    return(true);
}



VOID CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
{
::EnterCriticalSection(&lock);

if(idEvent == pTimer)
{
KillTimer(NULL, pTimer);
ResumeThread();

}

::LeaveCriticalSection(&lock);
}


otro ejemplo


class SimpleControl
{
public:
   SimpleControl (HWND hwndParent, int id)
       : _hWnd (GetDlgItem (hwndParent, id))
   {}

   void SetFocus ()
   {
       ::SetFocus (_hWnd);
   }

   // code is the HIWORD (wParam)
   static BOOL IsClicked (int code)
   {
       return code == BN_CLICKED;
   }

   HWND Hwnd () const { return _hWnd; }

   void Enable ()
   {
       EnableWindow (_hWnd, TRUE);
   }

   void Disable ()
   {
       EnableWindow (_hWnd, FALSE);
   }

   void SetFont (HFONT font)
   {
       SendMessage ( Hwnd (), WM_SETFONT, (WPARAM) font, MAKELPARAM(TRUE, 0));
   }
protected:
   HWND _hWnd;
};


LearningSpanishProgrammer

Eso llama la función que está en global (public, unnamed) namespace
Como las funciones del "stdio.h" y "stdlib.h"

Código (cpp) [Seleccionar]
  struct Test
  {
     int printf(const char *)
     {
    puts("Test::printf");
     }

     void test()
     {
         printf("Ola!"); // class printf
         ::printf("Ola"); // global (stdio.h)
     }
  };

int main(int argc, char * argv[])
{
Test t;
t.test();
return 0;
}
Estoy aprendiendo español, y tu estas aprendiendo programación

dewolo

hay gracias amigo, si es tal cual como en el ejemplo, ya entendi para que es...
pero mi pregunta seria la siguiente, porque no se le especifica el espacio de nombres o  clase a la que pertenece, por ejemplo si fuera de la libreria estandar seria "std::xxxxx" pero en estos casos que te mostre a modo de ejemplo, solo usa el "::" , y otra cosa, en algunas clases como la del ejemplo 2, no tenes un metodo llamado "EnterCriticalSection", y sin embargo en otro metodo de esa clase se llama a esa api usando el "::", por eso, algunas dudas me quedaron ojala me las puedas aclarar. pero lo que mostraste lo entendi bien  ;)


LearningSpanishProgrammer

Su duda es MUY buena, me gusta mucho cuando las personas tienen dudas tan buenas.

imagine que tu usa la biblioteca XX que usa EnterCriticalSection "as free function", pero tu tambien usas YY que  usa "myfunction::EnterCriticalSection" . Los dos funciones son globales, pero solo myfunction tienes un namespace.

Se tu hacer um codigo usando "using namespace myfunction". ¿Cómo podría llamar la "función global"? O entonces, por esto tambien, poderia  llamar, por inadvertencia, "myfunction::EnterCriticalSection" cuando en realidad querias "global EnterCriticalSection".   Usar :: es una buena pratica

Código (cpp) [Seleccionar]
#include <stdio.h>

namespace ps
{
  int printf(const char * p)
  {
  puts("ps::printf");
  }
}

int main(int argc, char * argv[])
{
ps::printf("ola");
::printf("ola");
using namespace ps;
printf("ola"); // Compilation error: which one?!
        ::printf("ola"); // Okay!
return 0;
}
Estoy aprendiendo español, y tu estas aprendiendo programación

dewolo



si al parecer esa es la razon, nunca lo considere, pero si todo lo que dijiste parece tener sentido,  y ser la razon por la que se usa, en ese caso seria una buena practica sin duda el usar el "::".
si hay algun otro uso de este operador no dejes de contarmelo XD