12

私は 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 クラスの最初の 2 つの連続する行に同じエラーが存在します。

コンパイルのどこにも、いずれかのクラスを定義する .c、.cpp、または .h ファイルがありません。なぜこのエラーが発生するのかわかりません。

4

4 に答える 4

32

そのヘッダー ファイルにはヘッダー ガードが必要です。おそらく2回含まれています。

これらの行を最初と最後に追加して、ヘッダーを変更します。

#ifndef STUDENT_H
#define STUDENT_H

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

#endif

定義する必要はありませんSTUDENT_H...一意である必要があります。

これらのディレクティブを追加すると、ヘッダー ファイルが既に解析されている場合、コンパイラはヘッダー ファイルのすべての内容を無視します。

または標準の C++ ではありませんが、すべての主要なコンパイラで単一の

#pragma once

ヘッダーの最初の行として、複数回解析されるのを防ぎます。

于 2012-01-22T19:59:54.967 に答える
4

おそらく .h ファイルを 2 回インクルードしています。1 回目は Student を定義し、2 回目はそれを再定義しようとします。

問題のより広範な説明とそれを回避する方法については、インクルード ガードに関するウィキペディアのエントリを参照してください。

要するに、それを行うには2つの方法があります

バージョン 1、#defined インクルード ガード

#ifndef STUDENT_HPP
#define STUDENT_HPP

...your code here...

#endif

通常、 #define は、すべてのインクルード ファイルで異なる必要があるため、ファイル名のバリエーションと呼ばれます。

バージョン 2、#pragma once

#pragma once

...your code here...

このプラグマは (ほとんどのプラグマと同様に) すべてのコンパイラに移植できるわけではありませんが、最も重要なものの一部には移植できます。また、手動で名前を割り当てる必要がないという利点もあります。

どちらを使用するかはあなた次第ですが、ほとんどの場合、いずれかを選択する必要があります:)

于 2012-01-22T20:00:41.023 に答える
3

私は使用することを好みます

   #pragma once

定義の代わりに、ヘッダー ファイルの最初の行として。これが非標準であっても、名前の競合を回避し、コンパイル時間を短縮できます。

于 2012-01-22T20:04:41.177 に答える
0

私が c++ を学んだとき、私たちの教授は、c++ のクラスで書く最初の 2 行は、必ず #ifndef の後に #define を書くべきだと言いました。これにより、ヘッダーファイルでの複数の定義が防止されます

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

于 2012-01-22T22:47:32.553 に答える