为什么我会重新定义类错误?

时间:2010-09-19 16:26:19

标签: c++ class redefinition

代码转储道歉:

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 个答案:

答案 0 :(得分:37)

您正在头文件中定义类,将头文件包含到* .cpp文件中并再次定义该类,因为第一个定义被头文件拖入转换单元。但每个翻译单元只允许一个gameObject类定义。

实际上,您不需要第二次定义类来实现这些功能。实现这样的功能:

#include "gameObject.h"

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

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

答案 1 :(得分:9)

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 { } 定义块

答案 2 :(得分:3)

你两次定义同一个班级是为什么。

如果您的目的是实现CPP文件中的方法,那么请执行以下操作:

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

答案 3 :(得分:1)

添加头文件

#pragma once

答案 4 :(得分:1)

你应该像这样包装.h文件:

#ifndef Included_NameModel_H

#define Included_NameModel_H

// Existing code goes here

#endif

答案 5 :(得分:0)

您可以在class gameObject文件和.cpp文件中定义.h
这就是造成重新定义错误。

您应该在 ONE 位置定义班级 ONCE 。 (约定说定义在.h,所有实现都在.cpp

请帮助我们更好地了解,您遇到问题的错误信息的哪一部分?

错误的第一部分表示该类已在gameObject.cpp中重新定义 错误的第二部分表示先前的定义位于gameObject.h

这条消息有多清楚?

答案 6 :(得分:0)

包含一些#ifndef名称#define名称#endif预处理器,可以解决您的问题。 问题是它从头部到函数然后再返回到头部,因此它多次使用所有预处理器(#include)重新定义类。

答案 7 :(得分:0)

如果您在模板方面遇到问题,或者正在从另一个.cpp文件调用该类

尝试在头文件中使用“ #pragma一次”。