2010-09-19 17 views
10

Apologies für den Code dump:Warum bekomme ich diese Neudefinition von Klassenfehlern?

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

Fehler:

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

ich nicht herausfinden kann, was falsch. Hilfe?

Antwort

31

Sie definieren die Klasse in der Headerdatei, fügen die Headerdatei in eine * .cpp-Datei ein und definieren die Klasse ein zweites Mal, da die erste Definition von der Headerdatei in die Übersetzungseinheit gezogen wird. Es ist jedoch nur eine gameObject-Klassendefinition pro Übersetzungseinheit erlaubt.

Sie müssen die Klasse nicht ein zweites Mal definieren, nur um die Funktionen zu implementieren. Implementieren Sie die Funktionen wie folgt aus:

#include "gameObject.h" 

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

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

etc

+1

Ahhhh, danke! – Dataflashsabot

7

die Umsetzung in der CPP-Datei in Form

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

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

nicht innerhalb einer Klasse Gameobject { } Definitionsblock

sein sollte
+1

Zusätzlich zu diesem Fix sollten Konstruktoren * ctor-initializer-list * und nicht den Rumpf des Konstruktors zum Initialisieren von Elementvariablen verwenden. –

+0

stimme absolut zu (obwohl nicht auf die Frage bezogen) (+ 1 von mir) – frag

0

Sie definieren die class gameObject in Ihrer .cpp Datei und Ihre .h Datei.
Das erzeugt einen Neudefinitionsfehler.

Sie sollten die Klasse definieren, ONCE, in ONE Ort. (convention sagt der Definition ist in der .h, und alle die Umsetzung ist in der .cpp)

Bitte helfen Sie uns, besser zu verstehen, was Teil der Fehlermeldung haben Sie Probleme haben?

Der erste Teil des Fehlers, sagt die Klasse in gameObject.cpp
Der zweite Teil des Fehlers sagt in gameObject.h die vorherige Definition ist neu definiert wurde.

Wie viel klarer könnte die Nachricht sein?

+1

Es kann Ihnen klar sein, aber es ist wahrscheinlich nicht klar für Anfänger –

2

Sie definieren die gleiche Klasse zweimal, warum.

Wenn Ihre Absicht ist es, die Methoden in der CPP-Datei dann zu implementieren tun so etwas wie folgt aus:

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

Fügen Sie ein paar #ifndef Namen #define Name #endif Präprozessor, die Ihr Problem lösen sollte. Das Problem ist, dass es von der Kopfzeile zur Funktion und dann zurück in die Kopfzeile geht, so dass es die Klasse mit dem ganzen Präprozessor (#include) mehrmals neu definiert.

1

in Header-Dateien

#pragma once 
+0

Was wird dies erreichen? –

0

Sie sollten wickeln die .h Datei wie so hinzufügen:

#ifndef Included_NameModel_H 

#define Included_NameModel_H 

// Existing code goes here 

#endif 
Verwandte Themen