我正在从我正在讨论的材料中借这个例子。根据教科书,一切都很好。
然而,在尝试编译这些文件时,我遇到了问题(见下文)
3个文件
Date.cpp:
#include "Date.h"
Date::Date()
{
setDate(1,1,1900);
}
Date::Date(int month, int day, int year)
{
setDate(month, day, year);
}
Date.h:
class Date
{
public:
Date ();
Date (int month, int day, int year);
void setDate(int month, int day, int year);
private:
int m_month;
int m_day;
int m_year;
};
Main.cpp:
#include "Date.h"
int main ()
{
Date d1 ;
return 1;
}
尝试使用g++ *
进行编译时,我得到了
Undefined symbols for architecture x86_64:
"Date::setDate(int, int, int)", referenced from:
Date::Date() in cc8C1q6q.o
Date::Date() in cc8C1q6q.o
Date::Date(int, int, int) in cc8C1q6q.o
Date::Date(int, int, int) in cc8C1q6q.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
当我声明Date *d;
时,程序编译。
当我声明Date *d = new Date
时,程序失败。
请问这里发生了什么?
答案 0 :(得分:3)
您尚未为班级提供setDate
方法。您在头文件中声明它,但您也需要为它提供实际的代码。
您看到的错误是链接器(ld
)告诉您,虽然您有一段代码试图调用该方法,但链接器不知道它在哪里是
您需要提供方法,例如将以下内容放入Date.cpp
:
void Date::setDate (int month, int day, int year) {
m_month = month;
m_day = day;
m_year = year;
}
答案 1 :(得分:2)
你关心从两个构造函数调用的函数setDate是未定义的
你需要类似你的.cpp文件
void Date::setDate(int month, int day, int year)
{
//code
}
答案 2 :(得分:2)
您似乎从未定义过Date::setDate()