Pregunta

Me gusta usar funciones estáticas en C++ como una forma de categorizarlas, como lo hace C#.

Console::WriteLine("hello")

¿Esto es bueno o malo?Si las funciones se usan con frecuencia, supongo que no importa, pero si no, ¿presionan la memoria?

Qué pasa static const?

¿Fue útil?

Solución

pero es bueno o malo

El primer adjetivo que me viene a la mente es "innecesario".C++ tiene funciones y espacios de nombres libres, entonces, ¿por qué necesitarías convertirlos en funciones estáticas en una clase?

El uso de métodos estáticos en clases no instanciables en C# y Java es una solución porque esos lenguajes no tienen funciones libres (es decir, funciones que residen directamente en el espacio de nombres, en lugar de como parte de una clase).C++ no tiene ese defecto.Simplemente use un espacio de nombres.

Otros consejos

Estoy totalmente a favor de usar estática funciones.Estos simplemente tienen sentido, especialmente cuando se organizan en módulos (static class Cª#).

Sin embargo, el momento esas funciones necesitan algún tipo de datos externos (no constantes en tiempo de compilación), entonces esa función debe convertirse en un método de instancia y encapsularse junto con sus datos en una clase.

En una palabra:Las funciones estáticas están bien, los datos estáticos son incorrectos.

Aquellos que dicen que las funciones estáticas pueden ser reemplazadas por espacios de nombres están equivocados, aquí hay un ejemplo simple:

class X
{
   public:
   static void f1 ()
   {
      ...
      f2 ();
   }

   private:
     static void f2 () {}
};

Como puedes ver, función estática pública. f1 llama a otra función estática, pero privada f2.

No se trata sólo de una colección de funciones, sino de una colección inteligente con sus propios métodos encapsulados.Los espacios de nombres no nos darían esta funcionalidad.

Mucha gente usa el patrón "singleton", simplemente porque es una práctica común, pero en muchos casos se necesita una clase con varios métodos estáticos y solo un miembro de datos estáticos.En este caso, no es necesario ningún singleton.También llamando al método instance() es más lento que simplemente acceder directamente a las funciones/miembros estáticos.

Utilice espacios de nombres para crear una colección de funciones:

namespace Console {
    void WriteLine(...) // ...
}

En cuanto a la memoria, las funciones usan la misma cantidad fuera de una función, como una función miembro estática o en un espacio de nombres.Eso es:No hay más memoria que el código mismo.

Una razón específica por la que los datos estáticos son malos es que C++ no ofrece garantías sobre el orden de inicialización de los objetos estáticos en diferentes unidades de traducción.En la práctica, esto puede causar problemas cuando un objeto depende de otro en una unidad de traducción diferente.Scott Meyers analiza esto en el punto 26 de su libro More Effective C++.

De acuerdo con Frank aquí, no hay ningún problema con las funciones estáticas (globales) (por supuesto, siempre que estén organizadas).Los problemas sólo empiezan a aparecer realmente cuando la gente piensa "oh, simplemente ampliaré un poco más el alcance de este fragmento de datos".Pendiente resbaladiza :)

Para ponerlo realmente en perspectiva... Programación funcional ;)

El problema con las funciones estáticas es que pueden conducir a un diseño que rompa la encapsulación.Por ejemplo, si te encuentras escribiendo algo como:

public class TotalManager
{
    public double getTotal(Hamburger burger)
    {
        return burger.getPrice() + burget.getTax();
    }
}

...entonces quizás necesites repensar tu diseño.Las funciones estáticas a menudo requieren el uso de definidores y captadores que saturan la API de una clase y complican las cosas en general.En mi ejemplo, podría ser mejor eliminar los captadores de Hamburger y simplemente mover la clase getTotal() a la propia Hamburger.

Tiendo a crear clases que constan de funciones estáticas, pero algunos dicen que la "forma correcta" de hacerlo suele ser utilizar espacios de nombres.(Desarrollé mis hábitos antes de que C++ tuviera espacios de nombres).

Por cierto, si tiene una clase que consta solo de funciones y datos estáticos, debe declarar que el constructor es privado, para que nadie intente crear una instancia del mismo.(Ésta es una de las razones por las que algunos defienden el uso de espacios de nombres en lugar de clases).

Para la organización, utilice espacios de nombres como ya se indicó.

Para datos globales me gusta usar el único patrón porque ayuda con el problema del orden de inicialización desconocido de los objetos estáticos.En otras palabras, si utiliza el objeto como singleton, se garantiza que se inicializará cuando se utilice.

También asegúrese de que sus funciones estáticas no tengan estado para que sean seguras para subprocesos.

Normalmente sólo uso estática junto con el sistema de amigos.

Por ejemplo, tengo una clase que utiliza muchas funciones auxiliares internas (integradas) para calcular cosas, incluidas operaciones con datos privados.

Esto, por supuesto, aumenta la cantidad de funciones que tiene la interfaz de clase.Para deshacerme de eso, declaro una clase auxiliar en el archivo .cpp de clases original (y por lo tanto invisible para el mundo exterior), la hago amiga de la clase original y luego muevo las funciones auxiliares antiguas a un miembro estático (en línea). funciones de la clase auxiliar, pasando la clase antigua por referencia además de los parámetros antiguos.

Esto mantiene la interfaz delgada y no requiere una gran lista de funciones gratuitas para amigos.La inserción en línea también funciona muy bien, por lo que no estoy completamente en contra de la estática.(Lo evito tanto como puedo, pero me gusta usarlo así).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top