Почему я получаю это переопределение ошибки класса?

извинения за дамп кода:

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

ошибки:

||=== terrac, Debug ===|
C:terracgameObject.cpp|4|error: redefinition of `class gameObject'|
C:terracgameObject.h|3|error: previous definition of `class gameObject'|
||=== Build finished: 2 errors, 0 warnings ===|

Я не могу понять, что случилось. Помочь?

7 ответов


вы определяете класс в файле заголовка, включите файл заголовка в *.cpp-файл и определите класс во второй раз, потому что первое определение перетаскивается в блок перевода заголовочным файлом. Но на единицу перевода допускается только одно определение класса gameObject.

на самом деле вам не нужно определять класс во второй раз только для реализации функций. Реализуйте такие функции:

#include "gameObject.h"

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

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

etc


реализация в файле cpp должна быть в виде

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

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

не в объект класса { } блок определения


вы определяете один и тот же класс дважды, вот почему.

Если вы намерены реализовать методы в файле CPP, то сделайте что-то вроде этого:

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

добавить в заголовочных файлах

#pragma once

вы должны обернуть .h файл вот так:

#ifndef Included_NameModel_H

#define Included_NameModel_H

// Existing code goes here

#endif

определение class gameObject в своем и свой .
Это создает ошибку переопределения.

вы должны определить класс, один раз, в один место. (конвенция говорит, что определение находится в .h, и вся реализация находится в .cpp)

пожалуйста, помогите нам лучше понять, с какой частью сообщения об ошибке у вас возникли проблемы?

в первой части ошибки говорится: класс был переопределен в gameObject.cpp
Вторая часть ошибки говорит, что предыдущее определение находится в gameObject.h.

насколько яснее может быть смс?


включите несколько #ifndef name #define name # endif препроцессор, который должен решить вашу проблему. Проблема заключается в том, что он переходит из заголовка в функцию, а затем обратно в заголовок, поэтому он переопределяет класс со всеми препроцессором(#include) несколько раз.