2010-09-19 15 views
10

Disculpas por el volcado de código:¿Por qué recibo esta redefinición del error de clase?

gameObject.cpp:

#include "gameObject.h" 
class gameObject 
{ 
    private: 
    int x; 
    int y; 
    public: 
    gameObject() 
    { 
    x = 0; 
    y = 0; 
    } 

    gameObject(int inx, int iny) 
    { 
     x = inx; 
     y = iny; 
    } 

    ~gameObject() 
    { 
    // 
    } 
    int add() 
    { 
     return x+y; 
    } 
}; 

gameObject.h:

class gameObject 
{ 
    private: 
    int x; 
    int y; 
    public: 
    gameObject(); 

    gameObject(int inx, int iny); 
    ~gameObject(); 
    int add(); 
}; 

Errores:

||=== terrac, Debug ===| 
C:\terrac\gameObject.cpp|4|error: redefinition of `class gameObject'| 
C:\terrac\gameObject.h|3|error: previous definition of `class gameObject'| 
||=== Build finished: 2 errors, 0 warnings ===| 

No puedo entender lo que está incorrecto. ¿Ayuda?

Respuesta

31

Está definiendo la clase en el archivo de encabezado, incluya el archivo de encabezado en un archivo * .cpp y defina la clase una segunda vez porque la primera definición se arrastra a la unidad de traducción por el archivo de encabezado. Pero solo se permite una definición de clase gameObject por unidad de traducción.

No necesita definir la clase por segunda vez para implementar las funciones. Poner en práctica las funciones de la siguiente manera:

#include "gameObject.h" 

gameObject::gameObject(int inx, int iny) 
{ 
    x = inx; 
    y = iny; 
} 

int gameObject::add() 
{ 
    return x+y; 
} 

etc

+1

Ahhhh, gracias! – Dataflashsabot

7

la implementación en el archivo CPP debe ser en forma

gameObject::gameObject() 
    { 
    x = 0; 
    y = 0; 
    } 
gameObject::gameObject(int inx, int iny) 
    { 
     x = inx; 
     y = iny; 
    } 

gameObject::~gameObject() 
    { 
    // 
    } 
int gameObject::add() 
    { 
     return x+y; 
    } 
no

dentro de un GameObject clase { } bloque de definición

+1

Además de esta corrección, los constructores deben usar * ctor-initializer-list * y no el cuerpo del constructor para inicializar las variables miembro. –

+0

totalmente de acuerdo (aunque no relacionado con la pregunta) (+1 de mí) – frag

0

Define class gameObject tanto en su .cpp y su archivo .h.
Eso está creando un error de redefinición.

Debe definir la clase, ONCE, en ONE lugar. (convención dice que la definición está en el .h, y toda la aplicación se encuentra en la .cpp)

Por favor, nos ayudan a comprender mejor, qué parte del mensaje de error ¿ha tenido problemas con?

La primera parte del error dice que la clase ha sido redefinido en gameObject.cpp
La segunda parte del error dice la definición anterior está en gameObject.h.

¿Cuánto más claro podría ser el mensaje?

+1

Puede ser claro para usted, pero probablemente no esté claro para los novatos –

2

Estás definiendo la misma clase dos veces ¿por qué?

Si su intención es poner en práctica los métodos en el archivo CPP y luego hacerlo algo como esto:

gameObject::gameObject() 
{ 
    x = 0; 
    y = 0; 
} 
gameObject::~gameObject() 
{ 
    // 
} 
int gameObject::add() 
{ 
     return x+y; 
} 
0

incluir algunos nombre #ifndef #define nombre #endif preprocesador que debe resolver su problema. El problema es que va del encabezado a la función y luego al encabezado, por lo que redefine la clase con todo el preprocesador (#include) varias veces.

1

añadir en los archivos de cabecera

#pragma once 
+0

¿Qué conseguirá? –

0

Usted debe envolver el archivo .h así:

#ifndef Included_NameModel_H 

#define Included_NameModel_H 

// Existing code goes here 

#endif 
Cuestiones relacionadas