Evitar la creación de clase cuyas funciones miembro son todas estáticas

votos
9

Todas las variables miembro y las funciones miembro en mi clase ClassA son estáticas.

Si un usuario intenta (por error) crear un objeto de esta clase, recibe una advertencia: Clase A, variable local nunca referenciada, porque todas las funciones son estáticas, por lo que nunca se hace referencia a este objeto. Por lo tanto, quiero evitar que el usuario intente crear un objeto de esta clase.

¿Sería suficiente crear un constructor privado por defecto (sin variables)? ¿O también tengo que crear un constructor de copia privada y un operador de asignación privada (para evitar el uso de los constructores por defecto)? Y si tengo que crearlos también, tal vez sería mejor crear una función virtual pura y falsa, ¿y esto evitará que el usuario cree un objeto?

Gracias

Publicado el 09/12/2008 a las 18:17
fuente por usuario
En otros idiomas...                            


5 respuestas

votos
20

En lugar de utilizar una clase con todos los métodos estáticos, puede que sea mejor hacer que los métodos funcionen independientemente en un espacio de nombres separado. La sintaxis de llamada sería la misma:

namespace::function() en lugar de classname::function()

y no necesitas tratar con alguien que intente crear una instancia de tu clase.

Respondida el 09/12/2008 a las 18:28
fuente por usuario

votos
11

Crear un constructor predeterminado privado debería ser suficiente. Las otras dos construcciones predeterminadas (constructor de copia y asignación) dependen de que una instancia funcione correctamente. Si no hay un constructor predeterminado, entonces no hay forma de crear una instancia, por lo tanto, no hay forma de llegar realmente a la parte de construcción de la copia.

Sin embargo, probablemente le ahorrará algunos dolores de cabeza definir a los 3 como privados y no implementados.

Respondida el 09/12/2008 a las 18:19
fuente por usuario

votos
10

Como dijeron otros, un espacio de nombres es lo que deberías usar. Si quieres quedarte con tu clase, crea una clase que tenga un constructor privado, y deriva de ella, para hacer obvia tu intención:

class NonConstructible { 
    NonConstructible();
};

class SuperUtils: NonConstructible {
    static void foo();
    // ...
    static std::vector<int> globalIDs;
    // ...
};

Bien, ahora veamos el espacio de nombres, que es la única forma de hacer esto:

namespace SuperUtils {
    void foo() {
        // ....
    }

    std::vector<int> globalIDs;
};

Puede invocar eso utilizando SuperUtils::foo();en ambos casos, pero el espacio de nombres tiene la ventaja de que en un ámbito puede usar la declaración y la directiva del espacio de nombres para incluir ciertos o todos los miembros en el alcance actual, de modo que pueda hacer referencia a ellos sin usar SuperUtils:::

void superFunction() {
    using namespace SuperUtils;
    foo();
}

Aunque, en general, esto debe evitarse, puede ser útil cuando el método utiliza exclusivamente muchas cosas de SuperUtils, lo que puede mejorar la legibilidad del código.

Respondida el 09/12/2008 a las 18:54
fuente por usuario

votos
3

Para usar un constructor de copia, debe tener un objeto para copiar, por lo que si ha bloqueado el constructor predeterminado, estará a salvo.

Respondida el 09/12/2008 a las 18:20
fuente por usuario

votos
0

La mejor forma de evitar la creación de objetos que no sean de almacenamiento es hacer privado el destructor. Entonces no hay forma de que el compilador pueda destruir el objeto cuando se sale del alcance y se quejará. Sin embargo, esto no evitará que nadie haga novedades.

Respondida el 10/12/2008 a las 09:35
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more