visual publicas programacion privadas privada modificadores modificador definicion clase acceso c++ static constructor namespaces

c++ - publicas - modificadores de acceso visual basic



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

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


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; };

Puedes llamarlo usando 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 llevar ciertos o todos los miembros al 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.


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.


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() lugar de classname::function()

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


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


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.