Siempre estaba confundido acerca de los archivos de encabezado. Son muy extraños: incluye un archivo .h que no incluye .cpp pero .cpp también se compila de alguna manera.
Recientemente me uní a un proyecto de equipo y, por supuesto, se utilizan .h y .cpp.
Entiendo que esto es muy importante, pero no puedo vivir con copiar y pegar cada declaración de función en cada una de las múltiples clases que tenemos.
¿Cómo manejo la convención de 2 archivos de manera eficiente?
¿Hay alguna herramienta para ayudar con eso, o cambiar automáticamente un archivo que se ve como ejemplo a continuación a .h y .cpp? (específicamente para MS VC ++ 2010)
class A
{
...
Type f(Type a,Type b)
{
//implementation here, not in another file!
}
...
};
Type f(Type a)
{
//implementation here
}
...
c++
language-design
naming
Oleh Prypin
fuente
fuente
Respuestas:
Escribir más refactorización amigable C ++
En C ++ no tiene que usar encabezados en absoluto. Puede definir todo el objeto en un archivo tal como lo haría con C # o Java. Los desarrolladores de C generalmente solo mantendrán llamadas externas en un archivo de encabezado. Todas las llamadas internas se definirían en el archivo .c. Del mismo modo, puede reservar sus archivos C ++ .h para las clases / interfaces (clases abstractas virtuales puras) / etc. que están destinados a ser compartidos fuera de la DLL. Para clases / estructuras / interfaces internas, etc., simplemente incluiría el archivo .cpp que necesita:
Este no parece ser el enfoque más popular, pero es legal C ++. Definitivamente sería una posibilidad para todo su código interno. Esto permite que el código interno y el conjunto de clases cambien mucho más radicalmente al tiempo que proporciona una interfaz más estable para que el código fuera de su biblioteca / ejecutable interactúe.
Tener toda tu clase dentro de un archivo hará que sea más fácil hacer lo que quieras. No resolverá el problema de renombrar un método y tener que buscar en cada lugar donde se llame ese método, pero se asegurará de que tenga más mensajes de error inteligibles. Nada peor que hacer que su encabezado declare un método de una manera, pero lo implementa de manera diferente. Otro código que llama al archivo de encabezado se compilará correctamente y obtendrá una excepción de enlace, mientras que el archivo de implementación será el que se queje de que el método no se definió. Cuando defina cada método en su lugar (en la declaración de clase real), obtendrá el mismo mensaje de error sin importar qué archivo lo incluya.
También puede consultar esta pregunta: buenas herramientas de refactorización para C ++
Cómo C / C ++ resuelve los archivos de encabezado / implementación
En el nivel base C (y C ++ se basa en esa base), los archivos de encabezado declaran la promesa de una función / estructura / variable que es suficiente para permitir que un compilador cree el archivo objeto. De manera similar, los archivos de encabezado de C ++ declaran la promesa de funciones, estructuras, clases, etc. Es esta definición la que utiliza el compilador para reservar espacio en la pila, etc.
Los archivos .c o .cpp tienen la implementación. A medida que el compilador convierte cada archivo de implementación en un archivo de objeto, hay ganchos para los conceptos no implementados (lo que se declaró en el encabezado). El vinculador vincula los ganchos a las implementaciones en otros archivos de objetos y crea un binario más grande que incluye todo el código (biblioteca compartida o ejecutable).
VS específico
En cuanto a trabajar con aquellos en Visual Studio, hay algunos asistentes que ayudan a facilitar un poco las cosas. El nuevo asistente de clase creará su par coincidente de encabezado y archivos de implementación. Incluso hay una función de navegador de clase que le permitirá declarar nuevos métodos. Inyectará la definición en el encabezado y el código auxiliar de implementación en el archivo .cpp. Visual Studio ha tenido esas características durante más de una década (siempre que las haya usado).
fuente
Conviértete en un desarrollador de Java.
Si realmente debe continuar desarrollando en C ++, puede intentar usar un IDE. A menudo ofrecen algún mecanismo por el cual puede agregar un método a una clase, y coloca automáticamente la declaración en el archivo .h y la definición en el archivo .cpp.
fuente
Podrías estar interesado en los maquilladores programa de Hwaci (los que hacen SQLite y Fossil).
También eche un vistazo a cómo se construye el fósil para tener una idea.
fuente
Cuando escribe las primeras líneas de una nueva clase, generalmente es porque la necesita en un lugar solo en ese momento. En un momento posterior, podría usarse en más lugares, pero inicialmente generalmente no lo es.
Muchas de mis clases comienzan en la parte superior del archivo .cpp actual. Cuando se ha estabilizado lo suficiente como para usarlo en varios lugares, lo pego en un encabezado. Aunque a menudo la clase desaparece tan rápido como apareció.
fuente
Como sugerencia para ayudar a manejar los archivos de encabezado C ++, es común usarlos sin extensión de archivo o sufijo de archivo, como lo hacen las bibliotecas "GCC".
Si este es su caso, sugiero utilizar una extensión de archivo " .hpp" (o unleast " .hxx") o un sufijo de archivo.
Es posible que deba configurar su compilador, el entorno del desarrollador o el programa Build.
fuente
#include <iostream>
? Esos no son solo para la biblioteca GCC. De hecho, está definido en el estándar C ++ de 1997 , sección 17.3.1.2. Evitaría nombrar archivos como ese. Puede, pero la razón por la cual la biblioteca estándar de C ++ lo hizo fue probablemente para evitar conflictos de nombres. De hecho, me parece realmente extraño cuando los compiladores agregan automáticamente un '.h' cuando incluye un encabezado, me parece bastante poco estándar. Y nunca veo a nadie encabezados de nombre sin sufijo, excepto la biblioteca estándar de c ++.#include <someclass>
ser leído como#include <someclass.hpp>
en todos los compiladores. Tu código se romperá.