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

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

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

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

Ответ 1

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

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

#include "gameObject.h"

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

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

и т.д.

Ответ 2

реализация в файле 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;
    }

не в пределах class gameObject { } блок определения

Ответ 3

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

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

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

Ответ 4

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

#pragma once

Ответ 5

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

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

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

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

Насколько яснее могло бы быть сообщение?

Ответ 6

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

Ответ 7

Вы должны обернуть файл .h следующим образом:

#ifndef Included_NameModel_H

#define Included_NameModel_H

// Existing code goes here

#endif