¿Cómo trato con las clases que solo se usan una vez, por ejemplo, en una sola función?

7

Tengo una clase que básicamente construye una versión eficiente de la memoria de una estructura que se utilizará en una sección de código de rendimiento crítico.

La estructura resultante es fea pero extremadamente rápida, por lo que no usarla no es realmente una opción, pero tampoco puedo usarla como la única representación de mi estructura porque tiene partes que no son relevantes para el análisis eliminado. ¿Mencioné que también es muy feo?

Llamemos a esta clase Fast . También tengo la bonita representación original, llamémosla Pretty . Tengo una función llamada Process() que se supone que toma en una instancia de Pretty , la convierte en Fast y luego hace unos pocos millones de cálculos en ella y escupe un resultado:

Pretty pretty;
// do stuff with pretty

// in another hpp:
double Process(const Pretty& pretty)
{
  Fast fast(pretty); // create my fast object

  // do some processing on fast

  return result; // at this point fast dies
}

La instancia de Fast se crea y muere dentro de Process , pero desafortunadamente no puedo declarar una clase dentro de una función, así que tengo que declararla en otra parte.

Lo que me gustaría hacer es hacer que toda la clase sea accesible solo a Process , y ni siquiera tenerla vista por otra persona (al igual que yo a la inversa declare una función private si la clase fuera el único objeto que debería tener acceso a ella). ¡Pero no puedo declarar una clase como privada!

Aquí está mi intento actual:

class Process
{
public:
  static double DoProcess(Pretty pretty); // this is the process function

private:
  class Fast
  {
    // construct fast here (only Process can see this class!)
  };
};

Y luego acabo de llamar a Process::DoProcess() . Este no es realmente un problema crítico, así que no lo publiqué en SO, pero es una pregunta de estilo y realmente me gustaría tener una solución clara. Nunca me he topado con este problema antes y me preguntaba cómo lo trataron los demás, y si se les ocurrió una solución mejor.

    
pregunta quant 06.07.2014 - 04:55

2 respuestas

8

Puedo ver tres opciones viables aquí, donde, desde una perspectiva de diseño, encuentro la más atractiva desde abajo.

Una de ellas es utilizar su enfoque, tal vez con operator() para evitar la redundancia.

Otra opción es definir la clase dentro de la función en sí misma (esto está permitido ahora).

Sin embargo, es probable que necesite la clase más adelante y, sinceramente, dudo que su espacio de nombres esté tan lleno que no pueda ofrecer el alcance del archivo de clase Fast .

En este escenario, declare el método Process en su encabezado y defínalo en un archivo .cpp , debajo de la definición de su clase Fast , que debe incluir en un espacio de nombres anónimo.

De cualquier manera, sacaría la definición del encabezado. Una compilación más rápida es una buena ganancia, pero el mayor beneficio es mantener la interfaz y la implementación separadas.

    
respondido por el VF1 06.07.2014 - 06:21
8

Deberías usar el modelo de compilación separado de C ++ para tu ventaja.

C ++ le permite definir una clase sin usar un archivo de encabezado, por lo que puede definir Fast en el mismo archivo fuente donde tiene la definición de Process .
Para evitar conflictos de nombres con otras unidades que también podrían tener una clase (diferente) Fast , puede envolverla en un espacio de nombres anónimo.

De esta manera, aunque Fast existe para todo el programa, solo Process puede acceder a él, porque esa es la única parte donde se conoce el nombre de Fast .
Esto supone que Process está definido dentro de un archivo .cpp y no como una función en línea en un archivo de encabezado. Para funciones de cualquier complejidad, este es un buen diseño de todos modos porque es poco probable que el compilador las incorpore y puede acelerar el paso de compilación de manera significativa.

    
respondido por el Bart van Ingen Schenau 06.07.2014 - 08:16

Lea otras preguntas en las etiquetas