2009-03-11 11 views
5

Saludos a todos.Declarar objetos de clase en un archivo de encabezado

Parece que me estoy enganchando en un fundimental pero no puedo encontrar la solución en ningún lado. Anywho, continuará y explicará.

Tengo un programa que consta de tres archivos; main.ccp, add.h, add.cpp.

que declarar la clase 'SA' en add.h y tienen todas mis funciones definidas en add.cpp

additional.h

class SA { 
    ... 
public 
    int x; 
} Obj1, Obj2; 

main.ccp

#include "additional.h" 

int main() { 

    Obj1.x = 5; 

    ... 
} 

Este me da un error de enlace al compilar: error LNK2005: "clase SA Obj1" (? Obj1 @@ 3VSA @@ A) ya definido en main.obj

La única definición del objeto se produce en add.h, y en ningún otro lugar. El programa compila bien si declarar los objetos en el principal y no el encabezado:

main.ccp

El tema es que quiero utilizar los objetos dentro primarially add.cpp, pero todavía necesito para inicializar varios valores públicos a través de main.cpp. ¿Alguna palabra de sabiduría?

Respuesta

11

Declarar Obj1 y Obj2 en su .cpp en lugar de al .h

add.h

class SA { 
... 
public 
    int x; 
}; 

main.cpp

#include "additional.h" 

SA Obj1, Obj2; 

int main() { 

Obj1.x = 5; 

... 
} 

Si quiere declarar Obj1 y Obj 2 en su archivo .h, añadir externo en el archivo .h de este modo:

extern SA Obj1, Obj2; 

pero debe declarar los objetos de un archivo .cpp en su proyecto:

main.cpp

SA Obj1, Obj2; 

La razón de esto es que cada vez que incluye el archivo .h, declara Obj1 y Obj2. Entonces, si incluye el archivo .h dos veces, creará dos instancias de Obj1 y Obj2. Al agregar la palabra clave extern, le está diciendo al compilador que ya ha desclasificado las dos variables en algún lugar de su proyecto (preferiblemente, en un archivo .cpp).

+0

perfecto. ¡Gracias! – Raugnar

6

Utilice extern palabra clave. Declare estos objetos públicos como externos en el encabezado, luego defina instancias en uno de los cpps.

De esta manera:

extern SA Obj1; // in header 

SA Obj1;// in any one (no more than one) cpp 
4

Usted también puede tener la siguiente línea de código en el archivo de cabecera:

static SA Obj1, Obj2; 

Esto creará a sólo 1 instancia de cada objeto en tiempo de ejecución y evitar redefiniciones. Sin embargo, tenga en cuenta que todos los archivos que incluyen el archivo .h usarán la misma instancia de esos dos objetos, por lo que deberá tener cuidado cuando los acceda.

Cuestiones relacionadas