2009-10-16 9 views
9

¿Hay algo de malo en tener una sola clase (una .h) implementada en varios archivos de origen? Me doy cuenta de que esto podría ser un síntoma de demasiado código en una sola clase, pero ¿hay algo técnicamente incorrecto en ello?Una clase con varios archivos de implementación

Por ejemplo:

foo.h

class Foo 
{ 
    void Read(); 
    void Write(); 
    void Run(); 
} 

Foo.Read.cpp

#include "Foo.h" 
void Foo::Read() 
{ 
} 

Foo.Write.cpp

#include "Foo.h" 
void Foo::Write() 
{ 
} 

Foo.Run.cpp

#include "Foo.h" 
void Foo::Run() 
{ 
} 

Respuesta

13

Esto está bien. Al final, estará todo unido.

Incluso he visto código, donde cada función miembro estaba en un archivo * .cpp diferente.

+1

Eso me volvería loco. Estoy seguro de que en ocasiones hay buenas (o al menos decentes) razones para hacer esto, pero desde la perspectiva de tratar de entender el modelo de objetos, bleah ... tener que saltar archivos para seguir los métodos. – Joe

+1

Si construye una biblioteca, dividir cada función y global en su propio objeto permite al consumidor vincular solo los bits que hacen referencia y nada más. Sin embargo, es molesto trabajar con él. – ephemient

+1

@ephemient: ¿Por qué esto importa? ¿No podría un enlazador quitarle las funciones que no usa? ¿O es solo para mejorar los tiempos de enlace? –

4

No, nada técnicamente incorrecto con él. El enlazador juntará todas las piezas de Foo en el binario final.

1

He estado trabajando con Apache Portable Runtime, que hace más o menos lo mismo. Tiene un encabezado, digamos apr_client.h y varios archivos de implementación para las funciones en ese encabezado, cada archivo representa un aspecto de las operaciones del cliente. No está mal, y no es realmente inusual.

esto podría ser un síntoma de exceso de código en una sola clase

C++ no es Java, por lo que no tiene que escoger los nombres de archivo de acuerdo a sus nombres de clase.

0

sí, eso es legítimo, y de hecho, los lenguajes más nuevos como C# hacen ese tipo de cosas todo el tiempo.

6

Eso es legítima y tiene algunos (!?) ... ventajas

Si se enlaza el ejecutable con la biblioteca estática de esta clase, solamente las funciones que se utilizan conseguirán. Esto es muy útil para la limitada sistemas de recursos.

También puede ocultar los detalles de implementación de ciertas funciones. Dos personas pueden implementar partes de una clase sin conocerse entre sí. Útil para proyectos DOD.

Si nos fijamos en cualquier fuente CRT, verá el mismo patrón ...

+1

El punto que oculta los detalles de implementación para la misma clase es realmente estirarlo. Si tiene una clase que se puede dividir tan fácilmente, entonces debe ser de 2 clases, no una. –

+0

@Richard: Bueno, solo quería decir que puedes hacerlo, no tienes que hacerlo. Si la función es tan simple, puede que no prefiera crear una clase separada para ello ... – Malkocoglu

+1

@Richard - ¿eh? - ¿Qué pasa con un "dispositivo" por ejemplo foo :: leer foo :: escribir foo :: ioctl ¿qué pasa con los beneficios de los tiempos de compilación más cortos? – pgast

2

es perfectamente válido. Todos los archivos cpp se vincularán entre sí.

Esto puede ser útil para, como dijiste, hacer que un archivo de implementación muy grande sea más legible y, dado que cada archivo cpp es una unidad de compilación, podrías (ab) usar ese hecho. (Espacios de nombre sin nombre, por ejemplo)

+0

+ por mencionar la mayor oportunidad para el enlace interno –

0

Hay dos puntos que pueden valer la pena considerar.optimizaciones de ancho

Clase:

Si el compilador tiene todas las funciones miembro visibles a ella cuando su analizar el archivo (suponiendo un único compilador TU), entonces puede ser capaz de realizar optimizaciones entre el miembros diferentes funciones.

revisión de código

Si todas las definiciones de una clase están en la misma TU, entonces esto hace que la revisión de código manual de fácil. Si las definiciones se dividen en diferentes TU, esto aumenta significativamente el esfuerzo requerido para una revisión manual, ya que se deben buscar los archivos apropiados, con un parpadeo constante entre las ventanas para obtener la imagen "completa".

Cuestiones relacionadas