多个定义编译错误

时间:2014-04-12 00:59:58

标签: c++ compiler-errors multiple-definition-error

我在StackExchange上的第一篇文章! 我有一个C ++课程的作业;创建使用以前分配日期类(月,日,年)和时间类(小时,分钟,上午/下午)的约会类。 我想我的大部分主要/语法错误都没有。

我的问题是,我目前已经完成了#includes和头文件,我得到了日期和时间的构造函数的多个定义错误 (我对模板知之甚少,但我需要与他们合作。)

我的档案:

  • Appointment.cpp

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

    我需要能够创建时间/日期对象,我应该使用.h还是.cpp文件?

  • Appointment.h

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

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

    #ifndef _DATE_H_
    #define _DATE_H_
    
  • time.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)
    {...}
    
  • output.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.如果我需要发布更多信息,我很高兴。我也有所有文件的压缩版本。

1 个答案:

答案 0 :(得分: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开头的全部大写标识符。