Entiendo que uno de los beneficios de tener funciones miembro estáticas no es tener que inicializar una clase para usarlas. Me parece que otra ventaja de ellos podría ser no tener acceso directo a las cosas no estáticas de la clase.Uso de la palabra clave "estática" para limitar el acceso en C++ Member Functions
Por ejemplo, una práctica común es si usted sabe que una función tendrá argumentos que no se deben cambiar, simplemente marque esta constante. e.g .:
bool My_Class::do_stuff(const int not_to_be_changed_1,
std::vector<int> const * const not_to_be_changed_2)
{
//I can't change my int var, my vector pointer, or the ints inside it.
}
Por lo tanto, es válido usar funciones de miembro estáticas para limitar el acceso. Por ejemplo, digamos que usted tiene una función
void My_Class::print_error(const unsigned int error_no) {
switch (error_no) {
case 1:
std::cout << "Bad read on..." << std::endl;
break;
//...
default:
break;
}
}
Bueno, aquí no vamos a acceder a las variables miembro de la clase. Así que si cambiaba la función a:
static void My_Class::print_error(const unsigned int error_no) {
switch (error_no) {
case 1:
std::cout << "Bad read on..." << std::endl;
break;
//...
default:
break;
}
}
ahora me sale un error, si inadvertidamente intentado acceder a una de mis var privado, etc. (a menos que me pase a mí mismo una instancia de mi clase, lo que haría tener un propósito^_ ^!)
¿Es esta una técnica válida, similar a hacer proactivamente args que no deberían cambiar constantes?
¿Qué inconvenientes podría tener en términos de eficiencia o uso?
Mi principal razón para preguntar es que la mayoría de los tutoriales "estáticos" que leí no mencionaron su uso de esta manera, así que me preguntaba si había una buena razón para no hacerlo, considerando que parece una utilidad herramienta.
Editar 1: Una justificación más lógica de este uso:
I tiene un print_error función, como se describe anteriormente. Podría utilizar un espacio de nombres:
namespace MY_SPACE {
static void print_error(...) {
...
}
class My_Class {
....
void a(void)
}
}
Pero esto es un dolor, porque ahora tengo para alargar TODOS mis declaraciones var, es decir
MY_SPACE::My_Class class_1;
todos para eliminar una función de mi clase, que, esencialmente, es un miembro de mi clase.
Por supuesto que hay múltiples niveles de control de acceso para las funciones:
//can't change pointer to list directly
void My_Class::print_error(std::vector<int> const * error_code_list) {...}
//can't change pointer to list or list members directly
void My_Class::print_error(std::vector<int> const * const error_code_list) {...}
//can't change pointer to list or list members directly, access
//non-const member vars/functions
void My_Class::print_error(std::vector<int> const * const error_code_list) const {...}
//can't change pointer to list or list members directly, access
//non-static member vars/functions
static void My_Class::print_error(std::vector<int> const * const error_code_list) {...}
//can't change pointer to list or list members directly, access
//member vars/functions that are not BOTH static and const
static void My_Class::print_error(std::vector<int> const * const error_code_list) const {...}
Seguro que esto es un poco atípica, pero a la disminución de grados por lo que están usando las funciones y variables const const. He visto muchos ejemplos donde las personas podrían haber usado una función const, pero no lo hicieron. Sin embargo, algunas personas piensan que es una buena idea. Conozco a muchos programadores de C++ que no comprenderán las implicaciones de una función const o estática. Del mismo modo, muchos entenderían ambos.
Entonces, ¿por qué algunas personas están tan firmemente en contra de usar esto como un mecanismo de control de acceso si el lenguaje/especificación permite su uso como tal, al igual que con las funciones const, etc.?
Parece extraño tener una función como miembro de una clase si va a denegarle derechos de acceso a los miembros. – JoshD
Una forma mejor de limitar el acceso sería simplemente usar una función que no sea miembro. Aunque no entiendo realmente de qué estás tratando de protegerte. –
Supongamos que tiene una función miembro que usted SABE que no necesita acceder a las variables/funciones miembro en el presente, pero que está relacionada con el trabajo/función de la clase. Conceptualmente, su inclusión en la clase tiene sentido, pero desea asegurarse de que no haya acceso de los miembros de la clase. Por lo tanto, podría convertirlo en una función estática, del mismo modo que crearía una variable que desea impedir el acceso a una variable 'const'. Claro que simplemente no puedes tocar la variable/miembros, y por lo tanto no usar 'const' /' static', pero muchos eligen errar por el lado de la precaución, al menos en el uso de 'const'. –