У одного класса есть ошибка переопределения класса - PullRequest
9 голосов
/ 22 января 2012

Я новичок в 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 (класс Student) является переопределением «Student», а строка 15 ({- открытая скобка, следующая за классом Student) является предыдущим определением «Student». Та же ошибка в первых двух последовательных строках существует для класса StudentSchedule.

У меня в компиляции нет файлов .c, .cpp или .h, которые бы определяли какой-либо класс. Я понятия не имею, почему я получаю эту ошибку.

Ответы [ 4 ]

25 голосов
/ 22 января 2012

Вам нужно защита заголовка в этом файле заголовка.Предположительно он включается дважды.

Измените заголовок, добавив эти строки в начало и конец.

#ifndef STUDENT_H
#define STUDENT_H

// Put the entire contents of your header here...

#endif

Определение не обязательно должно быть STUDENT_H ... itпросто должен быть уникальным.

С добавлением этих директив компилятор будет игнорировать все содержимое файла заголовка, если он уже был проанализирован.

В качестве альтернативы , в то время как это не стандарт C ++ , все основные компиляторы позволят вам поставить одну

#pragma once

в качестве первой строки заголовка, чтобы предотвратить его многократный анализ.

4 голосов
/ 23 января 2012

Вероятно, вы включаете файл .h дважды, при первом определении он определяет Student, а второй при попытке его переопределить.

См. Запись в Википедии о включении охранников для более подробного объяснения проблемы и информации о том, как ее избежать.

Короче говоря, есть два способа сделать это

Версия 1, #defined включает охранников

#ifndef STUDENT_HPP
#define STUDENT_HPP

...your code here...

#endif

Обычно #define называется некоторым вариантом имени файла, поскольку оно должно быть разным в каждом включаемом файле.

Версия 2, #pragma Once

#pragma once

...your code here...

Эта прагма (как и большинство прагм) не переносима на все компиляторы, но некоторые из наиболее важных . Он также имеет то преимущество, что ему не нужно назначать имя вручную.

Что вы используете, зависит от вас, но вам, скорее всего, придется выбрать один:)

3 голосов
/ 23 января 2012

Я предпочитаю использовать

   #pragma once

в качестве первой строки файла заголовка вместо определений. Даже если это нестандартно, оно избегает конфликтов имен и может сократить время компиляции.

0 голосов
/ 23 января 2012

Когда я изучал c ++, наш профессор сказал, что первые две строки, которые вы пишете в классе c ++, всегда должны быть #ifndef, за которыми следует #define.Это предотвращает множественные определения в заголовочных файлах

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

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