QT C ++:头文件包含在MainWindow.h中时函数的多重定义

时间:2017-09-03 08:12:28

标签: c++ qt

好的我有一个MainWindow类,它由通常的mainwindow.h和mainwindow.cpp组成。如果我在qtcreator生成项目时没有改变任何内容,并且从代码或设计器向ui添加元素,则所有内容都会编译并正常工作。我还有一个处理日期的date.h文件。我之前在其他程序中也使用过它,它可以正常工作。但。一旦我尝试在mainwindow.h中包含date.h头文件,date.h文件中的每个函数都会有一个多重定义警告。 date.h文件如下所示:

#ifndef DATE_H
#define DATE_H

#include <string>
#include <ctime>
#include <cmath>
#include <iostream>
#include <exception>

namespace friday
{
    const float average_days_in_month = 30.42;

    // Returns true if date is in the gregorian calendar.
    bool check_date(const int &in_day, const int &in_month, const int &in_year);

    // Returns true if year is leap.
    bool is_leap(const int &in_year);

    enum {
        january = 1,
        february,
        march,
        april,
        may,
        june,
        july,
        august,
        september,
        october,
        november,
        december
    };

    class invalid_date {
    public:
        const char* what() const noexcept { return "Invalid date"; }
    };

    class Date
    {

        int day;
        int month;
        int year;


        // Leap year flag.
        bool ly;
    public:

        Date(const int &in_day, const int &in_month,
             const int &in_year) throw(invalid_date

        int get_day() const { return day; }
        int get_month() const { return month; }
        int get_year() const { return year; }
        std::string get_date_string(const std::string &format) const;

        void set_day(const int &in_day) throw(invalid_date);
        void set_month(const int &in_month) throw(invalid_date);
        void set_year(const int &in_year) throw(invalid_date);

    };

    Date::Date(const int &in_day, const int &in_month,
         const int &in_year) throw(invalid_date)
    {
         // Check date and throw exception if needed
    }

    bool check_date(const int &in_day, const int &in_month, const int        &in_year)
    {
    if (in_year < 1582)
        return false;
    if (in_year == 1582 && in_month < october)
        return false;
    if (in_month < 1 || in_month > 12)
        return false;

    switch (in_month)
    {

    case january:
    case march:
    case may:
    case july:
    case august:
    case october:
    case december:
        if (in_day < 1 || in_day > 31)
            return false;
        break;


    case april:
    case june:
    case september:
    case november:
        if (in_day < 1 || in_day > 30)
            return false;
        break;


    case february:
        if (is_leap(in_year))
        {
            if (in_day < 1 || in_day > 29)
                return false;
        }
        else
        {
            if (in_day < 1 || in_day > 28)
                return false;
        }
        break;


    }

    return true;

}


bool is_leap(const int &in_year)
{
    if (in_year % 4 != 0)
        return false;
    else if (in_year % 100 != 0)
        return true;
    else if (in_year % 400 != 0)
        return false;

    return true;
}

} // namespace friday
#endif

我该如何解决这个问题?

编辑:date.h文件包含函数的定义和声明。所以没有date.cpp文件存在。如果我在main.cpp中包含date.h,程序通常会编译

1 个答案:

答案 0 :(得分:0)

Date::Date的实施直接包含在课程中,就像您对get_day()所做的那样:

class Date
{
...
 Date(const int &in_day, const int &in_month,
   const int &in_year) throw(invalid_date) {
     // Check date and throw exception if needed
 }
... 
}

enum之前定义的转发定义中,将inline置于功能check_dateis_leap之前,如用户VTT已建议的那样。

同时将inline添加到check_dateadd_leap的实际函数实现中,这些实现在文件中的类定义之后发生。