Why am I getting this redefinition of class error? [duplicate]
Asked Answered
B

9

36

Apologies for the code dump:

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

Errors:

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

I can't figure out what's wrong. Help?

Berte answered 19/9, 2010 at 16:26 Comment(0)
K
59

You're defining the class in the header file, include the header file into a *.cpp file and define the class a second time because the first definition is dragged into the translation unit by the header file. But only one gameObject class definition is allowed per translation unit.

You actually don't need to define the class a second time just to implement the functions. Implement the functions like this:

#include "gameObject.h"

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

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

etc

Kimmy answered 19/9, 2010 at 16:29 Comment(0)
A
26

add in header files

#pragma once
Avilla answered 19/1, 2016 at 9:34 Comment(3)
What will this achieve?Coquette
@Coquette #pragma once achieves the same thing as zhangxiang's answerWasting
@Coquette If you need to include two separate files, while those two include the same third file, then your compiler will give you an error because it will try to include the same file twice, using #pragma once stops the compiler from behaving like this, by simply not allowing it to include the same file twice, and use the once included file both times.Eulaeulachon
T
10

the implementation in the cpp file should be in the 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;
    }

not within a class gameObject { } definition block

Tattan answered 19/9, 2010 at 16:30 Comment(2)
In addition to this fix, constructors should use ctor-initializer-list and not the body of the constructor to initialize member variables.Misfortune
absolutely agree (though not related to the question)(+1 from me)Tattan
V
10

You should wrap the .h file like so:

#ifndef Included_NameModel_H

#define Included_NameModel_H

// Existing code goes here

#endif
Verdha answered 10/5, 2016 at 17:47 Comment(1)
Also you can ignore .h files, and place everything inside a .cpp file, with that #ifndef command.Anhydrous
F
5

You're defining the same class twice is why.

If your intent is to implement the methods in the CPP file then do so something like this:

gameObject::gameObject()
{
    x = 0;
    y = 0;
}
gameObject::~gameObject()
{
    //
}
int gameObject::add()
{
        return x+y;
}
Forgiveness answered 19/9, 2010 at 16:31 Comment(0)
B
3

If you are having issues with templates or you are calling the class from another .cpp file

try using '#pragma once' in your header file.

Blackmun answered 15/3, 2019 at 3:39 Comment(1)
This was already posted as an answer to the same question here.Bill
T
2

Either try adding #pragma once at the top of your file, or the old way... Place this at the top of your code

#ifndef GAME_H //ensuring that this object is only initialized once
#define GAME_H 

and this below the last line

#endif

Which will ensure only a single initialization of the class.

Taxicab answered 25/3, 2022 at 10:25 Comment(0)
O
0

Include a few #ifndef name #define name #endif preprocessor that should solve your problem. The issue is it going from the header to the function then back to the header so it is redefining the class with all the preprocessor(#include) multiple times.

Onomasiology answered 13/7, 2013 at 1:32 Comment(0)
S
-2

You define the class gameObject in both your .cpp file and your .h file.
That is creating a redefinition error.

You should define the class, ONCE, in ONE place. (convention says the definition is in the .h, and all the implementation is in the .cpp)

Please help us understand better, what part of the error message did you have trouble with?

The first part of the error says the class has been redefined in gameObject.cpp
The second part of the error says the previous definition is in gameObject.h.

How much clearer could the message be?

Scutiform answered 19/9, 2010 at 16:30 Comment(1)
It may be clear to you, but it is probably not clear to newbiesCyanocobalamin

© 2022 - 2024 — McMap. All rights reserved.