【问题标题】:Why am I getting this redefinition of class error?为什么我会重新定义类错误?
【发布时间】:2011-04-14 08:57:56
【问题描述】:

为代码转储道歉:

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

我不知道出了什么问题。帮忙?

【问题讨论】:

    标签: c++ class redefinition


    【解决方案1】:

    如果您遇到模板问题或从另一个 .cpp 文件调用类

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

    【讨论】:

    • 这已经发布为同一问题的答案here
    【解决方案2】:

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

    #ifndef Included_NameModel_H
    
    #define Included_NameModel_H
    
    // Existing code goes here
    
    #endif
    

    【讨论】:

      【解决方案3】:

      添加头文件

      #pragma once
      

      【讨论】:

      • 这将实现什么?
      • @IgorGanapolsky #pragma once 实现与zhangxiang's answer 相同的功能
      • @IgorGanapolsky 如果你需要include 两个单独的文件,而这两个include 是同一个第三个文件,那么你的编译器会给你一个错误,因为它会尝试包含同一个文件两次, 使用 #pragma once 阻止编译器像这样运行,只是不允许它两次 include 同一个文件,并且两次都使用一次包含的文件。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        为什么你要定义同一个类两次。

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

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

        【讨论】:

          【解决方案6】:

          您在.cpp 文件和.h 文件中都定义了class gameObject
          这会造成重新定义错误。

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

          请帮助我们更好地理解,您对错误消息的哪一部分有问题?

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

          信息能清晰多少?

          【讨论】:

          • 你可能很清楚,但新手可能不太清楚
          【解决方案7】:

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

          不在一个 类游戏对象 { } 定义块

          【讨论】:

          • 除此修复外,构造函数应使用 ctor-initializer-list 而不是构造函数的主体来初始化成员变量。
          • 绝对同意(虽然与问题无关)(+1 来自我)
          【解决方案8】:

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

          您实际上不需要为了实现这些功能而第二次定义该类。实现如下功能:

          #include "gameObject.h"
          
          gameObject::gameObject(int inx, int iny)
          {
              x = inx;
              y = iny;
          }
          
          int gameObject::add()
          {
              return x+y;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-01-30
            • 1970-01-01
            • 2020-07-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多