No puede editar archivos wxWidgets

Quiero anular "DismissAndNotify" en "popupwin.h", pero sigue llamando a la función incorporada.

class WXDLLIMPEXP_CORE wxPopupTransientWindowBase : public wxPopupWindow {
protected:
    void DismissAndNotify()
    {
        Dismiss();
        OnDismiss();
    }
}
class WXDLLIMPEXP_CORE wxPopupTransientWindow : public wxPopupTransientWindowBase {
    virtual void DismissAndNotify(); // I want to call this function
}

PS: Soy nuevo en wxWidgets

Pregunta hecha hace 3 años, 4 meses, 28 días - Por algorithmarchitect


3 Respuestas:

  • DismissAndNotify() no es parte de la API pública en absoluto, así que utilizarlo sería una idea muy mala incluso si funcionaba porque su código podría dejar de trabajar fácilmente con una versión más reciente de wxWidgets o incluso con la misma versión en otra plataforma.

    La razón por la que no funciona es que ni siquiera es virtual, así que no puedes anularlo como intentas hacer. En lugar de eso podrías anular Dismiss() que es tanto público (documentado) como virtual o tal vez OnDismiss() si solo quieres reactr ante el popup siendo despedido.

    Respondida el Dec 17, 2020 a las 11:30 - por pixelpioneerc4b5

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando se debe a que estás tratando de anular una función en una clase derivada, pero no estás utilizando correctamente la palabra clave virtual. Para que una función en una clase base pueda ser anulada en una clase derivada, la función en la clase base debe estar declarada como virtual.

    En tu código, la función DismissAndNotify en wxPopupTransientWindowBase no está marcada como virtual, lo que significa que no se puede anular en la clase derivada wxPopupTransientWindow. Para corregir este problema, debes marcar la función DismissAndNotify como virtual en la clase base. Aquí te dejo cómo puedes hacerlo:

    cpp
    class WXDLLIMPEXP_CORE wxPopupTransientWindowBase : public wxPopupWindow {
    protected:
        virtual void DismissAndNotify()
        {
            Dismiss();
            OnDismiss();
        }
    };
    
    class WXDLLIMPEXP_CORE wxPopupTransientWindow : public wxPopupTransientWindowBase {
    public:
        virtual void DismissAndNotify() override // Se usa 'override' para indicar que se está anulando una función base
        {
            // Aquí puedes implementar tu propia lógica para DismissAndNotify en wxPopupTransientWindow
            wxPopupTransientWindowBase::DismissAndNotify(); // Se llama a la función base si es necesario
        }
    };
    

    Al marcar la función DismissAndNotify como virtual en wxPopupTransientWindowBase y usar la palabra clave override en la función anulada en wxPopupTransientWindow, garantizarás que se llame a la implementación correcta de la función cuando se use un puntero o una referencia de la clase derivada.

    Respondida el Dec 18, 2020 a las 11:31 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Solución:

    Para anular correctamente DismissAndNotify en wxPopupTransientWindow, debes seguir estos pasos:

    • Declara la función de anulación en la clase derivada `wxPopupTransientWindow`:
    cpp
    class WXDLLIMPEXP_CORE wxPopupTransientWindow : public wxPopupTransientWindowBase {
    public:
        virtual void DismissAndNotify() override; // Anular la función
    };
    
    • Define la implementación de la función anulada:
    cpp
    void wxPopupTransientWindow::DismissAndNotify()
    {
        // Código personalizado
    
        // Llama a la implementación base (opcional, si es necesario)
        wxPopupTransientWindowBase::DismissAndNotify();
    }
    

    Al seguir estos pasos, estarás anulando correctamente DismissAndNotify en wxPopupTransientWindow. La función anulada reemplazará a la función incorporada en la clase base.

    Nota:

    Si la implementación de la función anulada no llama a la implementación base, entonces la implementación base no se ejecutará. Por lo tanto, asegúrate de llamar a wxPopupTransientWindowBase::DismissAndNotify() si deseas ejecutar la implementación base.

    Respondida el Dec 18, 2020 a las 11:37 - por Gemini

    Votos positivos: 0 | Votos negativos: 0