So beheben Sie einen C ++ - Fehler: Neudefinition von 'class'

Aug 31 2020

Ich bin neu in der C ++ - Programmierung und habe einen Compilerfehler, den ich nicht herausfinden kann. Jede Hilfe wäre dankbar.

Hier ist das Build-Protokoll:

C:\Dev\MemberTest\Entity.cpp|6|error: redefinition of 'class Entity::Entity'|
C:\Dev\MemberTest\Entity.h|6|error: previous definition of 'class Entity::Entity'|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

Das Programm hat Main.cpp, Entity.hund Entity.cpp(ich war gerade bastelt mit , wie Header zu implementieren und Quelldateien).

#include <iostream>
#include "Entity.h"

int main()
{

    Entity::Entity Person("Grant", true); //Create person and set membership

    std::cout << Person.getName() << " is a member: " << Person.getMembership() << std::endl;

    return 0;
}
#ifndef ENTITY_H_INCLUDED
#define ENTITY_H_INCLUDED

namespace Entity
{
class Entity
{

    private:
        std::string name;
        bool member;

    public: //Get, set, constructor calls for a bool and string.
        Entity(std::string y, bool x);
        bool getMembership();
        std::string getName();
        void setMembership(bool x);

};
}

#endif // ENTITY_H_INCLUDED
#include <string>
#include "Entity.h"

namespace Entity
{
class Entity
{
    private:
        std::string name;
        bool membership;

    public:
        Entity(std::string y, bool x):name(y),membership(x){}
        bool getMembership(){return this->membership;};
        std::string getName(){return this->name;};
        void setMembership(bool x){this->membership=x;};

};
}

Ich habe mich nach einer Lösung umgesehen und Fragen wie diese gefunden: Fehler: Neudefinition der Klasse, aber die Lösungen, die ich sehe, sind für mein Programm nicht relevant, da ich sie bereits verwende #ifndef.

Da ich nicht sicher bin, welche anderen Informationen hier möglicherweise benötigt werden, befinden sich alle drei Dateien im selben Ordner und es befinden sich keine anderen Quell- oder Header-Dateien in diesem Ordner. Seltsamerweise, wenn ich das #include "Entity.h"in der Entity.cppDatei auskommentiere und auf die Quelle verweise, Main.cppanstatt Entity.hsie zu kompilieren und einwandfrei auszuführen . Ich codiere auf Code :: Blocks und mit dem GCC Compiler. Nochmals vielen Dank für jede Hilfe.

Antworten

1 Acorn Sep 01 2020 at 03:36

Die Implementierungsdatei ( Entity.cpp) sollte die Klassendefinition nicht erneut enthalten. Stattdessen schreiben Sie Nicht-Inline-Definitionen ("out of class"):

#include <string>
#include "Entity.h"

namespace Entity
{

Entity::Entity(std::string y, bool x) : name(y), membership(x) {}
bool Entity::getMembership() { return membership; }
std::string Entity::getName() { return name; }
void Entity::setMembership(bool x) { membership = x; }

}

Beachten Sie auch, dass Ihr Entity.hHeader davon abhängt, std::stringwelcher #include <string>Header dort benötigt wird, nicht nur in der Implementierungsdatei ( Entity.cpp). Hier müssen this->weder einige der Semikolons ( ;) verwendet werden.


Seltsamerweise, wenn ich das #include "Entity.h"in der Entity.cppDatei auskommentiere und auf die Quelle verweise, Main.cppanstatt Entity.hsie zu kompilieren und einwandfrei auszuführen

Dies liegt daran, dass Sie Funktionen inline in der Klasse definieren können (anstatt sie in die Implementierungsdatei einzufügen). Sie haben alle in der Klassendefinition implementiert, und daher benötigen Sie keine Implementierungsdatei mehr.

Mit anderen Worten, Sie Entity.cppsahen aus wie eine Header-Datei mit einer vollständigen Implementierung der Klasse, obwohl Sie sie .cppeher als aufgerufen haben .h. Wenn Sie diese Datei einschließen, würde dies funktionieren.