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

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

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

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

9 ответов

Решение

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

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

#include "gameObject.h"

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

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

так далее

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

#pragma once

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

#ifndef Included_NameModel_H

#define Included_NameModel_H

// Existing code goes here

#endif

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

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

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

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

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

Если у вас возникли проблемы с шаблонами или вы вызываете класс из другого файла.cpp

попробуйте использовать "#pragma Once" в заголовочном файле.

Либо попробуйте добавить #pragma onceв верхней части вашего файла или по-старому... Поместите это в верхнюю часть вашего кода

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

а это под последней строкой

      #endif

Что обеспечит одну инициализацию класса

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

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

Вы должны определить класс, ОДИН РАЗ, в ОДНОМ месте. (Конвенция гласит, что определение в .hи вся реализация в .cpp)

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

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

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

Другие вопросы по тегам