2012-01-22 12 views
7

Soy nuevo en C++, y tengo un problema con las definiciones de mi clase en un archivo de encabezado. El código para el archivo de cabecera (Student.h) es:La clase individual tiene un error de redefinición de clase

#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(){} 
}; 

El error del compilador dice que la línea 14 (clase Estudiante) es una redefinición de 'estudiante', y que la línea 15 ({- al aire libre llave después de la clase Estudiante) es la definición previa de 'Estudiante'. El mismo error en las primeras dos líneas consecutivas existe para la clase StudentSchedule.

No tengo ningún archivo .c, .cpp o .h en ninguna parte de mi compilación que defina cualquiera de las clases. No tengo idea de por qué estoy recibiendo este error.

Respuesta

18

Necesita header guards en ese archivo de encabezado. Presumiblemente está siendo incluido dos veces.

Modifique el encabezado, agregando estas líneas al principio y al final.

#ifndef STUDENT_H 
#define STUDENT_H 

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

#endif 

La definición no tiene por qué ser STUDENT_H ... Simplemente tiene que ser único.

Con estas directivas agregadas, el compilador ignorará todo el contenido del archivo de encabezado si ya se ha analizado.

Alternativamente, mientras it is not standard C++, todos los principales compiladores permitirá poner un solo

#pragma once 

como la primera línea de la cabecera para evitar que sea analizado varias veces.

3

Probablemente esté incluyendo el archivo .h dos veces, la primera vez que definirá Estudiante, el segundo intentará redefinirlo.

Consulte el Wikipedia entry on include guards para obtener una explicación más detallada del problema e información sobre cómo evitarlo.

En resumen, hay dos maneras de hacerlo

Versión 1, #defined incluyen guardias

#ifndef STUDENT_HPP 
#define STUDENT_HPP 

...your code here... 

#endif 

lo general, el #define se llama alguna variación del nombre de archivo, ya que tiene que ser diferente en cada archivo de inclusión.

Versión 2, #pragma vez

#pragma once 

...your code here... 

Esta es Pragma (como la mayoría de pragmas) no portátil para todos los compiladores, pero some of the most important ones. También tiene la ventaja de no necesitar un nombre asignado manualmente.

cual se utiliza depende de usted, pero lo más probable es que tenga que elegir uno :)

2

Yo prefiero usar

#pragma once 

como la primera línea de un archivo de cabecera, en lugar de las define. Incluso si esto no es estándar, evita los conflictos de nombres y puede reducir el tiempo de compilación.

+1

Es agradable (sin duda más simple), pero eso no es estándar de C++ –

+0

sí, que es el único inconveniente. Para mí, las ventajas superan esto. –

Cuestiones relacionadas