0

StackExchange での最初の投稿です。C++ コースの課題があります。Date クラス (月、日、年) と Time クラス (時間、分、AM/PM) の以前の割り当てを使用する Appointment クラスを作成します。プライマリ/構文エラーのほとんどが邪魔にならないと思います。

私の問題は、#includes とヘッダー ファイルを現在どのように行っているかで、日付と時刻のコンストラクターの複数定義エラーが発生することです。 (そして、私はテンプレートについてあまり知りませんが、それらを使用する必要があります。)

私のファイル:

  • 予定.cpp

    #include "time.cpp"
    #include "date.cpp"
    #include "appointment.h"
    

    Time/Date オブジェクトを作成できるようにする必要があります。.h または .cpp ファイルを使用する必要がありますか?

  • 予定.h

    #ifndef _APPOINTMENT_H_
    #define _APPOINTMENT_H_
    #include <iostream>
    #include "time.h"
    #include "date.h"
    
  • 日付.cpp

    #ifndef _DATE_CPP_
    #define _DATE_CPP_
    #include "date.h"
    
  • 日付.h

    #ifndef _DATE_H_
    #define _DATE_H_
    
  • 時間.cpp

    #ifndef _TIME_CPP_
    #define _TIME_CPP_
    #include "time.h"
    
  • time.h

    #ifndef _TIME_H_
    #define _TIME_H_
    

以下は、上記のファイルの実装に関連しています。

  • main.cpp

    #include "arrayListType.h"
    #include "appointment.h"
    
    void read(arrayListType<Appointment>&);
    void output(const arrayListType<Appointment>&);
    
    int main()
    {
       arrayListType<Appointment> appointments;
       read(appointments);
       output(appointments);
       return 0;
    }
    
  • read.cpp

    #include "arrayListType.h"
    #include "appointment.h"
    #include <fstream>
    using namespace std;
    
    void read(arrayListType<Appointment>& appointments)
    {...}
    
  • 出力.cpp

    #include "arrayListType.h"
    #include "appointment.h"
    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    void output(const arrayListType<Appointment>& appointments)
    {...}
    
  • arrayListType.h (すべての実装がテンプレートとして含まれています)

  • itemType.h

最後の 2 を参照する必要があるかどうかわかりません。さらに情報を投稿する必要がある場合は、喜んで投稿します。すべてのファイルの圧縮バージョンもあります。

4

1 に答える 1

1

Appointment.cpp から次の行を削除します。

#include "time.cpp"
#include "date.cpp"

.cpp別のファイルからのファイルを含めることはほとんどありません。.cppそのため、ファイルに含まれているインクルード ガードを削除することもできます。

これらの行は、関数を実装するファイルとの間でmain.cppインクルードされるヘッダー ファイルにある必要があります。main.cpp.cpp

void read(arrayListType<Appointment>&);
void output(const arrayListType<Appointment>&);

ヘッダーファイルのポイントが欠けているようです。アイデアは、インターフェイス実装を分離することです。ヘッダー ファイルは、ヘッダーにリストされている関数を呼び出すために、別のユニットが知る必要があるすべての情報を提供します。関数が呼び出されると、.cppファイルは実際に作業を行います。ヘッダーファイルで指定された「契約」を満たしている限り、他のユニットはそれがどのように機能するかを知る必要はありません。

衝突の可能性を回避するために、さらにいくつかの変更を提案します。

  • 別のものに変更"time.h"します。と呼ばれる標準ヘッダー<time.h>があり、コンパイラまたはシステム環境の設定がわずかに間違っていて、間違ったものを含めることは簡単です
  • H_APPOINTMENTヘッダー ガード トークンの形式を使用します。で始まり_、大文字が続く識別子は予約されています。で始まるすべて大文字の識別子も同様Eです。
于 2014-04-12T01:58:12.167 に答える