2010-09-19 33 views
10

Ci scusiamo per il codice di discarica:Perché sto ottenendo questa ridefinizione dell'errore di classe?

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(); 
}; 

Errori:

||=== 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 ===| 

non riesco a capire cosa sta sbagliato. Aiuto?

risposta

31

Si sta definendo la classe nel file di intestazione, includere il file di intestazione in un file * .cpp e definire la classe una seconda volta poiché la prima definizione viene trascinata nell'unità di traduzione dal file di intestazione. Ma è consentita una sola definizione di classe gameObject per unità di traduzione.

In realtà non è necessario definire la classe una seconda volta solo per implementare le funzioni. Implementare le funzioni in questo modo:

#include "gameObject.h" 

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

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

ecc

+1

Ahhhh, grazie! – Dataflashsabot

7

l'attuazione nel file cpp deve essere in 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; 
    } 
non

all'interno di una class gameObject { } blocco di definizione

+1

Oltre a questa correzione, i costruttori devono utilizzare * ctor-initializer-list * e non il corpo del costruttore per inizializzare le variabili membro. –

+0

assolutamente d'accordo (anche se non correlato alla domanda) (+ 1 da me) – frag

0

Si definisce lo class gameObject in entrambi i valori .cpp e il tuo file .h.
Questo sta creando un errore di ridefinizione.

È necessario definire la classe, ONCE, in ONE luogo. (convenzione dice che la definizione è nel .h, e tutto l'implementazione è in .cpp)

Aiutateci a capire meglio, quale parte del messaggio di errore hai avuto problemi con?

La prima parte dell'errore dice la classe è stato ridefinito in gameObject.cpp
La seconda parte dell'errore dice la definizione precedente è in gameObject.h.

Quanto più chiaro potrebbe essere il messaggio?

+1

Potrebbe essere chiaro a voi, ma probabilmente non è chiaro ai neofiti –

2

Si sta definendo la stessa classe due volte è perché.

Se il vostro intento è quello di implementare i metodi nel file CPP poi farlo o meno così:

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

includere alcuni nome #ifndef nome #define #endif preprocessore che dovrebbe risolvere il tuo problema. Il problema è che va dall'intestazione alla funzione, quindi torna all'intestazione, quindi sta ridefinendo la classe con tutto il preprocessore (#include) più volte.

1

aggiungere nei file di intestazione

#pragma once 
+0

Cosa otterrà? –

0

Si dovrebbe avvolgere il file .h in questo modo:

#ifndef Included_NameModel_H 

#define Included_NameModel_H 

// Existing code goes here 

#endif 
Problemi correlati