2009-12-07 15 views
7

Estoy trabajando en un proyecto para la escuela y el instructor insiste en que todo el código entre en un archivo .cpp (para una calificación más fácil por su parte). Me gustaría definir múltiples clases dentro de este archivo. ¿Me encontraré con algún problema al hacer esto?¿Es posible definir múltiples clases en un solo archivo .cpp?

+2

Puede colocar sus clases en los encabezados que desee, luego ejecute gcc -E y envíe la salida al instructor. No hagas eso, porque (a) tu instructor se rehusará a leerlo, y (b) todas las inserciones de los encabezados estándar activarán alertas de plagio. Pero si echas un vistazo a esa salida una vez y notas que es compilable, verás que puedes hacer lo que quieras en un archivo cpp que puedes hacer en los encabezados. –

+1

Si su instructor le ha solicitado que envíe un solo archivo, ¿no es razonable suponer que su lenguaje de programación lo permita? ¿Qué razón tuvo para dudar de su instructor en este asunto en particular? –

+0

@Rob: es un buen punto, dado que conocemos la respuesta, pero consideramos que los instructores a menudo imponen condiciones tales como: "sin usar llamadas recursivas, solo bucles"; "solo usando llamadas recursivas, sin bucles"; y, en general, "colgado boca abajo con una mano atada a la espalda". Sin duda por razones de enseñanza, pero significa que su suposición no siempre es correcta o razonable ;-) –

Respuesta

25

No hay ninguna regla que deba seguir (como en java). Puede colocar y nombrar clases en los archivos con los nombres que desee (además del sufijo).

Sin embargo, es otra pregunta si eso es buenas prácticas (¡no!).

+1

Para agregar a esto, no olvide que debe colocar las clases que va a utilizar antes de su clase principal o el compilador no las encontrará. (a menos que use la declaración directa) – DaMacc

6

No hay problema al escribir varias clases en un solo archivo. Es solo cuestión de estilo de mantenimiento.

3

Solo problemas de escalabilidad/mantenimiento;) No hay reglas estrictas al respecto.

+6

Si este proyecto escolar sufre problemas de escalabilidad, Chad necesita negociar un salario por su trabajo ;-) –

9

Sí, puedes. Esto es fácilmente verificable.

class C 
{ 
}; 

class D 
{ 
}; 

int main(int argc, char**argv) 
{ 
    return 0; 
} 
+6

aunque se aplica el descargo de responsabilidad habitual de C++, "solo porque su compilador lo acepta no significa que sea permitido según el estándar C++ "(aunque en este caso es, por supuesto, perfectamente válido) – jalf

+0

Sí, buen punto. –

3

No. No tendrá problemas. En C++ puedes definir múltiples clases dentro de un solo archivo.

5

Puede perfectamente tener varias clases declaradas y definidas en el mismo archivo.

Tiene que tener cuidado, sin embargo, cuando una clase depende de otra que viene después. Si una clase A debe ser miembro de otra clase B, el compilador necesita su declaración completa (para que sepa su tamaño), y debe colocarla más arriba en el archivo. Sin embargo, si este miembro solo es un puntero (que tiene un tamaño independiente del tamaño de la clase apuntada), bastará con una simple declaración directa de la clase apuntada.

Tenga en cuenta que con el mecanismo #include, eso es más o menos lo que sucede de todos modos: el preprocesador "copiar y pegar" todos los archivos incluidos en el archivo que se está compilando. Para el compilador, es lo mismo.

3

No tendrá problemas para definir múltiples clases en un solo archivo.

No es especialmente buena práctica para los sistemas de producción, pero eso no es un problema para la tarea

3

Sí se puede. Esto debe ser compatible porque de lo contrario no sería capaz de crear clases anidadas.

class outside 
{ 
public: 
     class nested 
     { 
     public: 
      static int x; 
      static int y; 
      int f(); 
      int g(); 
     }; 
}; 
4

Por lo general, sólo se debe poner varias clases en un solo archivo si ...

  1. Las clases están muy estrechamente vinculados. Por ejemplo, si una clase define su propio iterador, entonces podría ser apropiado poner esa clase de iterador en el mismo archivo que la clase sobre la que se usa para iterar.

  2. Una de las clases es para el consumo público, y las clases restantes se usan para implementarla. Por ejemplo, esto se aplicará si usa el modismo "pimpl", donde el único miembro que contiene la clase pública es un puntero a la clase privada. En este caso, puede ser apropiado colocar las clases privadas/ocultas en el archivo fuente correspondiente a la clase pública que las usa.

En ambos casos, la decisión de si se debe poner la "ayuda pública" (por ejemplo iterador) y "ayuda privado" (por ejemplo,pimpl) clases en el mismo archivo fuente o un archivo fuente diferente se debe hacer una vez para un proyecto completo, y se siguió de manera coherente.

+0

Me gusta su respuesta ya que explica algunos usos en los que es debatiblemente lo correcto. El ejemplo del iterador definitivamente estoy de acuerdo con. La razón por la que busqué esto fue porque estoy haciendo una ventana de diálogo con pestañas Qt para mis preferencias de aplicación y necesito una clase para la ventana y clases para las pestañas. Estoy debatiendo si dividir las pestañas en archivos, pero realmente no tengo un lugar en mi estructura de archivos para eso. – Lightbulb1

2

La pregunta proviene de la representación de fuente de estilo java/C#. En C++, el diseño del código fuente es muy diferente. Una unidad de origen/"archivo cpp"/podría manejar tantas declaraciones como desee poner en. Sin embargo, no es necesaria una buena estrategia, ya que en algún momento necesitas decirle a otras clases cómo manejar tus clases. En C++, una clase puede tener una sección separada de definición y declaración, y usted puede ubicarlas en diferentes archivos. La definición de la clase se comparte entre otros archivos fuente con instrucciones #include para que pueda usar esas clases en cualquier escenario donde se necesite la definición. Si está tratando con clases que se usan solo en un archivo fuente, puede ocultarlo directamente en los archivos fuente, pero si desea conectarlos a otras clases, debe colocar la definición en un archivo de encabezado.

Podría ayudarlo a mejorar la velocidad de compilación, especialmente si está usando encabezados precompilados, pero sin problemas, porque los pch-s no son parte del estándar de C++ y cada compilador los trata de una manera diferente. - y la flexibilidad de tu código. Su maestro debe tener en cuenta estos hechos ...

2

Sí, podría hacerlo sin problema. ya sea clase múltiple o clase anidada.

Cuestiones relacionadas