[C con Clase] puntero a WindowProcedure() en una clase?

Steven Richard Davidson stevenrichard.davidson en gmail.com
Dom Nov 4 09:04:59 CET 2007


Hola Dare,

On Nov 3, 2007 4:42 PM, Dare <dameuncigarro_12 en hotmail.com> wrote:
> ¿Es posible meter una función WindowProcedure directamente en una clase?
>
> Usando Dev-C++ bajo Windows, en un típico "hola mundo"
> digamos que intento introducirlo en una clase propia de este modo:
>
>    class _miclase{
>      public:
>      LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
>      ...
>    } miclase;
>
>    LRESULT CALLBACK _miclase::WindowProcedure(...
>
>    ...
>
>    WinMain(){
>    ...
>    wincl.WindowProcedure = miclase.WindowProcedure ; //<- ESTO DA ERROR!!
>
>
>
> y salta este error:
> 311 argument of type `LRESULT (_miclase::)(HWND__*, UINT, WPARAM, LPARAM)' does not match `LRESULT (*)(HWND__*, UINT, WPARAM, LPARAM)'
>
>
>
>
> ...¿estoy haciendo algo mal o quizás no se puede directamente?, y sólo se puede haciendo:
>
> LRESULT CALLBACK WindowProcedure (...)
> {
>     return miclase.WindowProcedure(...);
> }
>

La forma correcta de mantener una función miembro en una clase para
que actúe como una función global es declarando una función estática.
Esto sería,


class _miclase
{
  static LRESULT CALLBACK WindowProcedure (...);
  ...
};

Ahora define 'WindowProcedure()' de esta manera:

LRESULT CALLBACK _miclase::WindowProcedure (...)
{
  ...
}

y usa su puntero a función así,

WinMain()
{
  ...
  wincl.WindowProcedure = _miclase::WindowProcedure;
  ...
}

De esta forma, siempre existe la misma función.


Podrías usar tu propuesta, pero entonces tendrás que instanciar el
objeto 'miclase' globalmente. Esto tendrá el mismo efecto que el uso
de una función miembro estática.


Espero haber aclarado la duda.

Steven




Más información sobre la lista de distribución Cconclase