【问题标题】:Single class has a Class Redefinition Error单个类有一个类重定义错误
【发布时间】:2012-02-16 08:40:44
【问题描述】:

我是 C++ 新手,头文件中的类定义有问题。 头文件(Student.h)的代码是:

#include <string>
using namespace std;

class Student
{
  // Data Members for a Student
  string id;
  string preferences[3];
  int skill;

  // Constructor
 public:
  Student(){}

 public:
  void SetID(string str)
  { this->id = str; }
 public:
  void SetSkill(int i)
  { this->skill = i; }
 public:
  void SetPreferences(int i, string s)
  {
    this->preferences[i] = s;
  }
};

class StudentSchedule
{
 public:
  StudentSchedule(){}
};

编译器错误表明第 14 行(学生类)是“学生”的重新定义,而第 15 行({ -- Student 类后面的左大括号)是“学生”的先前定义。 StudentSchedule 类存在前两行连续的相同错误。

我的编译中的任何地方都没有定义任何一个类的 .c、.cpp 或 .h 文件。我不知道为什么会出现这个错误。

【问题讨论】:

    标签: c++ class redefinition


    【解决方案1】:

    您需要在该头文件上使用header guards。它大概被包含了两次。

    修改标题,将这些行添加到开头和结尾。

    #ifndef STUDENT_H
    #define STUDENT_H
    
    // Put the entire contents of your header here...
    
    #endif
    

    定义不需要是STUDENT_H...它只需要是唯一的。

    添加这些指令后,如果头文件已经被解析,编译器将忽略它的所有内容。

    或者,而it is not standard C++,所有主要的编译器都允许你放一个

    #pragma once
    

    作为头部的第一行,防止被多次解析。

    【讨论】:

      【解决方案2】:

      您可能包含 .h 文件两次,第一次将定义 Student,第二次将尝试重新定义它。

      请参阅Wikipedia entry on include guards,了解有关该问题的更详细说明以及如何避免该问题的信息。

      简而言之,有两种方法可以做到这一点

      版本 1,#defined 包含警卫

      #ifndef STUDENT_HPP
      #define STUDENT_HPP
      
      ...your code here...
      
      #endif
      

      通常 #define 被称为文件名的某种变体,因为它在每个包含文件中都必须不同。

      版本 2,#pragma once

      #pragma once
      
      ...your code here...
      

      这个编译指示(和大多数编译指示一样)不能移植到所有编译器,但some of the most important ones。它还具有不需要手动分配名称的优点。

      您使用哪个取决于您,但您很可能必须选择一个:)

      【讨论】:

        【解决方案3】:

        我更喜欢使用

           #pragma once
        

        作为头文件的第一行,而不是定义。即使这是非标准的,它确实可以避免名称冲突并减少编译时间。

        【讨论】:

        • 很好(当然更简单),但这不是标准的 C++
        • 是的,这是唯一的缺点。对我来说,优势大于这个。
        【解决方案4】:

        当我学习 c++ 时,我们的教授说,你在 c++ 类中编写的前两行应该始终是#ifndef,然后是#define。这样可以防止头文件中的多个定义

        http://www.fredosaurus.com/notes-cpp/preprocessor/ifdef.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-14
          相关资源
          最近更新 更多