Почему я получаю это переопределение ошибки класса? - PullRequest
17 голосов
/ 19 сентября 2010

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

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

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

Ответы [ 8 ]

37 голосов
/ 19 сентября 2010

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

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

#include "gameObject.h"

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

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

и т. Д.

9 голосов
/ 19 сентября 2010

реализация в файле 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 {}, блок определения

3 голосов
/ 19 сентября 2010

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

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

gameObject::gameObject()
{
    x = 0;
    y = 0;
}
gameObject::~gameObject()
{
    //
}
int gameObject::add()
{
        return x+y;
}
1 голос
/ 10 мая 2016

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

#ifndef Included_NameModel_H

#define Included_NameModel_H

// Existing code goes here

#endif
1 голос
/ 19 января 2016

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

#pragma once
0 голосов
/ 15 марта 2019

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

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

0 голосов
/ 13 июля 2013

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

0 голосов
/ 19 сентября 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...