web-dev-qa-db-fra.com

Pourquoi ai-je cette redéfinition de l'erreur de classe?

Toutes mes excuses pour le vidage de code:

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

Les erreurs:

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

Je ne peux pas comprendre ce qui ne va pas. Aidez-moi?

14
Dataflashsabot

Vous définissez la classe dans le fichier d'en-tête, incluez le fichier d'en-tête dans un fichier * .cpp et définissez la classe une seconde fois car la première définition est déplacée dans l'unité de traduction par le fichier d'en-tête. Toutefois, une seule définition de classe gameObject est autorisée par unité de traduction.

En réalité, vous n'avez pas besoin de définir la classe une seconde fois pour implémenter les fonctions. Implémentez les fonctions comme ceci:

#include "gameObject.h"

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

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

etc

35
sellibitze

l'implémentation dans le fichier cpp doit être sous la forme

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

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

pas dans un bloc de définition class gameObject {}

9
frag

Vous définissez la même classe deux fois, c'est pourquoi.

Si votre intention est d'implémenter les méthodes du fichier CPP, procédez comme suit:

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

ajouter des fichiers d'en-tête

#pragma once
1
Helperors

Vous devriez envelopper le fichier .h comme suit:

#ifndef Included_NameModel_H

#define Included_NameModel_H

// Existing code goes here

#endif
1
zhangxiang

Incluez quelques #ifndef name #define name #endif préprocesseur qui devrait résoudre votre problème . Le problème est que cela passe de l’en-tête à la fonction puis à l’en-tête afin qu’elle redéfinisse la classe avec tout le préprocesseur ) plusieurs fois.

0
J.J.

Vous définissez le class gameObject dans votre fichier .cpp et votre fichier .h.
Cela crée une erreur de redéfinition.

Vous devez définir la classe,UNE FOIS, dansONEplace ..__ (la convention stipule que la définition est dans le .h et que toute l'implémentation est dans le .cpp)

S'il vous plaît, aidez-nous à mieux comprendre quelle partie du message d'erreur avez-vous eu des problèmes?

La première partie de l'erreur indique que la classe a été redéfinie dans gameObject.cpp
La deuxième partie de l'erreur indique que la définition précédente est dans gameObject.h.

Combien plus clair le message pourrait-il être?

0
abelenky