2012-09-13 16 views
5

Ok, estoy escribiendo un código con una estructura [en C++], y no estoy seguro de si implementar la estructura en el archivo de encabezado o en el archivo fuente.¿Debo implementar una estructura con el constructor en el encabezado o el archivo de origen?

La estructura incluye un constructor:

struct Point 
{ 
    double x; 
    double y; 

    Point(double xCo, double yCo) 
    { 
     this->x = xCo; 
     this->y = yCo; 
    } 

    int comparePoint(Point point) 
    { 
     ... 
    } 
}; 

he escrito en el archivo de cabecera:

typedef struct Point point; 

¿Es lo suficientemente bueno, o es un mal diseño? Como leo en algunos sitios web, una estructura generalmente se implementa en el archivo de encabezado,

pero en una tarea anterior que tuve [en C], el personal del curso nos proporcionó un archivo de encabezado que incluía declaración a la estructura y NO la implementación.

Vi otras preguntas aquí similares a esta, pero en realidad no respondieron mi pregunta.

+4

Ese typedef no es necesario en C++. Es un modismo de C – Antimony

+0

No es gran cosa. Una diferencia es que si coloca la implementación en el archivo de encabezado, entonces cualquier función debe estar en línea (están en línea por defecto en su código de muestra anterior). – john

Respuesta

3

Se puede declarar el constructor en la cabecera y anotar una implementación en el archivo CPP:

struct Point 
{ 
    Point(double xCo, double yCo); 
    ... 
}; 

Point::Point(double xCo, double yCo) 
{ 
    ... 
} 

Pero debe haber una declaración en el encabezado ya que el compilador depende de ella para compilar los otros archivos cpp que dependen de la estructura.

+0

bien pero, [esto puede sonar estúpido pero ...] ¿cómo voy a llegar a la "x" y "y" en la estructura? Si estaba escribiendo una clase, y la x, y se definieron como privadas, agregaría funciones get/set para alcanzar las variables x, y. ¿Es necesario hacer lo mismo aquí? porque si no lo hago, obtengo un error. –

+0

@NadinHaddad: si sus miembros de datos 'x' e' y' son 'public', no necesita los métodos get/set: puede usar notación de punto (o' -> 'si hace referencia a la estructura/clase instancia vía punteros). –

5

No hay respuesta a esto, realmente depende de la situación. ¿Le importa que el código de cliente tenga acceso a la implementación del constructor y que tendrá que volver a compilarse cada vez que realice un cambio allí? Si es así, no lo implemente en el encabezado. Tenga en cuenta que en este contexto, en C++ struct y class son equivalentes, por lo que las mismas reglas generales deberían aplicarse a ambos.

Lo que debe hacer es utilizar la lista de inicialización de constructores:

Point(double xCo, double yCo) : x(xCo), y(yCo) {} 
7

Hay una gran diferencia entre el uso de struct en C y C++.

En C, struct declaración declara una estructura con una etiqueta, no un nombre de tipo. Como resultado, debe hacer referencia por etiqueta como struct Point a menos que agregue un typedef a su alrededor.

En C++, struct es un sinónimo de class, diferentes sólo en la accesibilidad miembro predeterminado (privada para class y público para struct). Un nombre de tipo siempre se define para el struct sin un typedef, por lo que no es necesario agregar un typedef alrededor de su struct en C++.

Esto no influye en la forma en que declara su constructor: puede alinearlo en el encabezado o moverlo a la implementación. De cualquier manera, va a funcionar. Probablemente sea mejor poner inicializadores simples que pasen args a la lista de inicialización en el encabezado, mientras que una inicialización más compleja debería ir probablemente en el archivo cpp, pero depende totalmente de usted.

1

Considerando que en C++ una estructura es solo una clase con "acceso de miembro predeterminado" establecido en público en lugar de privado, le sugiero que haga exactamente lo mismo con su estructura como si estuviera codificando una clase.

Cuestiones relacionadas