好的我有一个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,程序通常会编译
答案 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_date
和is_leap
之前,如用户VTT已建议的那样。
同时将inline
添加到check_date
和add_leap
的实际函数实现中,这些实现在文件中的类定义之后发生。