2011-09-08 19 views
19

Aunque hay no static classes in C++, proceden de un fondo Java que utilizo para crear una clase auxiliar como Util que contiene solo métodos estáticos. ¿Esto se considera mal estilo o práctica habitual? Una alternativa que veo es usar funciones C (sin contexto de clases). ¿Qué otras alternativas hay? ¿Cuáles son las ventajas y desventajas y en qué circunstancias usaría cualquiera de estos?Ventajas de las clases con solo métodos estáticos en C++

defining bunch of static methods in c++ sugiere el espaciado de nombres funciones estáticas como una alternativa, aunque no puedo ver qué efectos tiene la palabra clave static sin contexto de clase.

+0

Lea la respuesta de Charles Bailey en la publicación que ha vinculado. static tiene un significado muy diferente en C++ cuando se aplica a funciones libres (funciones sin un contexto de clase) vs funciones de miembro de clase estáticas – nos

Respuesta

22

Si desea crear una colección de funciones de utilidad y sin clobbering el espacio de nombres global, sólo debe crear funciones regulares en su propio espacio de nombres:

namespace utility { 
    int helper1(); 
    void helper2(); 
}; 

Es probable que no quieres que sean funciones estáticas o bien . Dentro del contexto de una función no miembro (a diferencia de una función miembro), la palabra clave estática en C y C++ simplemente limita el alcance de la función al archivo fuente actual (es decir, hace que la función sea privada para el archivo actual).Por lo general, solo se utiliza para implementar las funciones auxiliares internas utilizadas por el código de la biblioteca escrito en C, de modo que las funciones auxiliares resultantes no tienen símbolos que están expuestos a otros programas. Esto es importante para evitar conflictos entre nombres, ya que C no tiene espacios de nombres.

+4

Para aquellos que realizan la transición desde Java, tenga en cuenta que la terminología estándar apropiada de C++ es "Dentro del contexto de una función no miembro (a diferencia de una función miembro) ". Esto no significa que deba seguir esa terminología, pero algunos programadores de C++ (incluyéndome a mí) tienen un pequeño "¿de qué idioma estamos hablando?" duda cada vez que alguien habla sobre un "método" en C++. –

+0

@Steve, ¡gracias por señalar eso! No es tan trivial como lo haces sonar. Si sabe cuál es la terminología estándar para algo, puede encontrar mejores respuestas, especialmente si tiene un libro y está usando el índice para buscar temas. Eso también significa que para muchas discusiones en C++, la noción de una función está sobrecargada entre lo que muchos otros lenguajes a menudo llamarían un método o una función, por lo que sabían que una "función" como se definiría en otro idioma es más específicamente una "función no miembro" en C++ que me parece bastante importante. –

10

En C++, las clases con solostatic métodos se utilizan principalmente en la metaprogramación de plantillas.

Por ejemplo, quiero calcular números de Fibonacci en tiempo de compilación sí mismo, y en tiempo de ejecución Quiero que sólo se imprimen, entonces yo puedo escribir este programa:

#include <iostream> 

template<int N> 
struct Fibonacci 
{ 
    static const int value = Fibonacci<N-1>::value + Fibonacci<N-2>::value; 
    static void print() 
    { 
     Fibonacci<N-1>::print(); 
     std::cout << value << std::endl; 
    } 
}; 


template<> 
struct Fibonacci<0> 
{ 
    static const int value = 0; 
    static void print() 
    { 
     std::cout << value << std::endl; 
    } 
}; 

template<> 
struct Fibonacci<1> 
{ 
    static const int value = 1; 
    static void print() 
    { 
     Fibonacci<0>::print(); 
     std::cout << value << std::endl; 
    } 
}; 

int main() { 
     Fibonacci<20>::print(); //print first 20 finonacci numbers 
     return 0; 
} 

demostración en línea: http://www.ideone.com/oH79u

+1

No estoy seguro * la mayoría * es realmente preciso, creo que muchos programadores usan clases estáticas para agrupar lógicamente un conjunto de funciones relacionadas (la (mejor?) alternativa son funciones libres en un espacio de nombres). Sin embargo, su respuesta es correcta en cuanto a que las funciones de miembro estáticas son ampliamente utilizadas en TMP. –

+3

Noooo, no es el ejemplo de Fibonacci * otra vez *! :) –

+0

@Luc: 'Creo que muchos programadores usan clases estáticas para agrupar lógicamente un conjunto de funciones relacionadas'. Eso es cierto, pero ese escenario es bastante inferior a la metaprogramación. – Nawaz

3

C++ es un lenguaje de múltiples paradigma, así que si necesitas algunas funciones util que tal vez realmente no caben en una clase en absoluto, entonces me acaba de hacerlos funciones gratuitas. No veo una razón para ponerlos en una clase, solo por el bien de OOP.

No hay ninguna ventaja que pueda ver al hacer todas las funciones static y ponerlas en una clase, sobre tenerlas como funciones gratuitas. Personalmente, creo que las funciones gratuitas son más fáciles de trabajar con la opción.

+0

Puede usar espacios de nombres si desea agrupar las funciones. –

+2

Sé una ventaja. Si desea hacer un grupo de funciones amigos de una clase, es más fácil y en mi humilde opinión ponerlas en una clase y ser amigo de la clase en lugar de cada función individual. El escenario en el que estoy pensando serían los métodos de fábrica que necesitan acceso a constructores privados, etc. – tokage

0

No existe ningún problema real al declarar métodos estáticos dentro de una clase. Aunque los espacios de nombres son más adecuados para este propósito por las razones mencionadas en la publicación a la que se refiere.

El uso de funciones C puede generar colisiones de nombres, a menos que decida una convención de nombres, prefija sus funciones con cosas, por ejemplo btFunctionA, btFunctionB etc. Le conviene mantener sus símbolos dentro de los espacios de nombres para evitar eso, está utilizando C++ y no C después de todo.

Las funciones estáticas dentro de un espacio de nombres no son diferentes de las no estáticas. Creo que la palabra clave estática simplemente se ignora en este contexto.

0

En C++, solo dele funciones gratuitas. No hay necesidad o razón para colocarlos en una clase en absoluto. A menos que esté haciendo shizzle con plantillas.

1

Como muchos otros han señalado, las funciones gratuitas dentro de un espacio de nombres son un enfoque que a menudo se toma para este tipo de cosas en c++.

Un caso que me gustaría hacer para las clases con todas las funciones estáticas es cuando desea exponer un conjunto de funciones a la información derivada de los parámetros de plantilla, es decir

template <typename Ty> 
    class utils 
{ 
public : 
// if you need to setup a bunch of secondary types, based on "Ty" that will be used 
// by your utility functions 
    struct item_type 
    { 
     Ty data; 
     // etc 
    }; 

// a set of utilities 
    static void foo(Ty &data1, item_type &item) 
    { 
     // etc 
    } 
}; 

Usted puede usar esto para lograr el efecto de un espacio de nombres de plantilla:

int main() 
{ 
    double data; 
    utils<double>::item_type item ; 
    utils<double>::foo(data, item); 

    return 0; 
} 

Si no está utilizando plantillas, simplemente quédese con espacios de nombres.

Espero que esto ayude.

+0

buen punto. Esto también es como 'std :: numeric_limits <>' está implementado. – Walter

Cuestiones relacionadas