我正在使用Clion进行C++编码。
我正在尝试制作一个Date.cpp
文件和一个Date.h
文件。
这是我的代码:
#include "Date.h"
// Date constructor
Date::Date(int year, int month, int day)
{
SetDate(year, month, day);
}
// Date member function
void Date::SetDate(int year, int month, int day)
{
m_month = month;
m_day = day;
m_year = year;
}
class Date
{
private:
int m_year;
int m_month;
int m_day;
public:
Date(int year, int month, int day);
void SetDate(int year, int month, int day);
int getYear() { return m_year; }
int getMonth() { return m_month; }
int getDay() { return m_day; }
};
// Date constructor
Date::Date(int year, int month, int day)
{
SetDate(year, month, day);
}
// Date member function
void Date::SetDate(int year, int month, int day)
{
m_month = month;
m_day = day;
m_year = year;
}
我不断收到这些错误:
日期的多重定义::D ate(int, int, int)
和
Date::SetDate(int, int, int) 的多重定义
我应该如何重新组织我的代码,使其不再说我有多个定义?
根据您的图片,您确实有多个定义。 也就是说,如果您在.cpp文件中定义(写入)了一个函数,则无法将其写入标头中。
如果您尝试将实现放在没有文件的标头中.cpp则仅将其保留在.h文件中,并在定义前面加上内联关键字,即:
inline Date::Date(int year, int month, int day) {
}
您看到的错误是因为您的.h
和.cpp
文件都定义了相同的Date::Date()
并Date::SetDate()
实现体。 将它们从.h
文件中删除,因为它们不属于该文件,因为它们位于.cpp
文件中。
通常,.h
文件应用于声明和内联定义(即,类似于get..()
方法),而.cpp
文件应用于非行定义。
日期.h
#ifndef DateH // don't forget a header guard!
#define DateH
class Date
{
private:
int m_year;
int m_month;
int m_day;
public:
Date(int year, int month, int day);
void SetDate(int year, int month, int day);
// these are OK here!
int getYear() { return m_year; }
int getMonth() { return m_month; }
int getDay() { return m_day; }
// Or, you can move their definitions into the .cpp file, if you want...
/*
int getYear();
int getMonth();
int getDay();
*/
};
#endif
日期.cpp
#include "Date.h"
// Date constructor
Date::Date(int year, int month, int day)
{
SetDate(year, month, day);
}
// Date member function
void Date::SetDate(int year, int month, int day)
{
m_month = month;
m_day = day;
m_year = year;
}
// If you choose to move their definitions here...
/*
int Date::getYear()
{
return m_year;
}
int Date::getMonth()
{
return m_month;
}
int Date::getDay()
{
return m_day;
}
*/