es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La clase B deriva de la clase base abstracta A, ¿cómo puedo usar singleton en la clase B?

A continuación se muestra el código de demostración:

class A {
public:
    A(){}
    virtual void method()=0;
    //....
    virtual ~A(){};
}

class B : public A{
    static A * ptr;
    //....
public:
    //....
    static A* GetInstance() {
        if (ptr == nullptr)
            ptr = new B();  // error, actualmente B es una clase abstracta, no ha sido construida
        return ptr;
    }
    //.....
}

La clase B deriva de una clase base abstracta A, y ¿cómo puedo usar el patrón Singleton en la clase B?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como se muestra en el código, la clase B se deriva de una clase base abstracta A. Para implementar el patrón singleton en la clase B, necesitaríamos realizar los siguientes cambios en el código:

    1. Debemos asegurarnos de que la clase B ya no sea abstracta. Podemos lograrlo implementando la función puramente virtual de la clase A en la clase B.
    2. Necesitamos asegurarnos de que solo se cree una instancia de la clase B. Para lograr esto, podemos hacer el constructor de la clase B privado y proporcionar un método estático para obtener la instancia de la clase B.
    3. Necesitamos declarar y definir una variable estática de la clase B en el archivo de implementación de la clase B.

    Aquí está el código modificado que implementa el patrón singleton en la clase B:

    “`c++
    class A {
    public:
    A(){}
    virtual void method()=0;
    virtual ~A(){};
    };

    class B : public A{
    private:
    B(){} // constructor privado para aplicar el patrón singleton
    static B* ptr;
    public:
    void method() override {} // implementa la función puramente virtual
    static A* GetInstance() {
    if (ptr == nullptr)
    ptr = new B();
    return ptr;
    }
    };

    // Define la variable estática ptr
    B* B::ptr = nullptr;
    “`

    Con estos cambios, hemos convertido la clase B en una clase singleton que se deriva de una clase base abstracta A. Ahora podemos utilizar el método GetInstance() de la clase B para obtener la instancia singleton de la clase B.

Comments are closed.