为何出现链接器错误:undefined reference to `Date::Date(int, int, int)`?
链接器错误:undefined reference to
Date::Date(int, int, int) 原因与解决 问题重现
代码(s09-04-02.cpp)
// s09-04-02.cpp simple date #include <iostream> struct Date { int y, m, d; // year Date(int y, int m, int d); // declare constructor void add_day(int n); // declare to add n days int month() {return m;}; // define return month int day() {return d;}; // define return day int year() {return y;}; // define return year }; int main() { Date birthday {1970,12,30}; std::cout<<birthday.year()<<"\n"; std::cout<<birthday.month()<<"\n"; std::cout<<birthday.day()<<"\n"; }
编译命令
g++ -g -o s09-04-02 s09-04-02.cpp
错误输出
/usr/bin/ld: /tmp/ccXgSexK.o: in function `main': /home/c++/Stroustrup/PPandP2nd/Ch09Classes/s09-04-02.cpp:13: undefined reference to `Date::Date(int, int, int)' collect2: error: ld returned 1 exit status make: *** [Makefile:5: d09-04-02] Error 1
错误原因
你仅在struct Date中声明了构造函数Date(int, int, int),但没有提供该函数的定义(即函数体)。C++中,函数声明只是告诉编译器函数的名称、参数类型和返回值类型,而链接器需要找到函数的实际实现代码才能生成完整的可执行文件。当链接器找不到构造函数的实现时,就会抛出undefined reference错误。
解决方法
有两种方式可以补充构造函数的定义:
方式1:在struct内部直接定义构造函数
修改struct Date的代码,将构造函数的定义直接写在结构体内部,使用初始化列表赋值更高效规范:
struct Date { int y, m, d; // year // 直接在结构体内部定义构造函数,用初始化列表初始化成员变量 Date(int y_, int m_, int d_) : y(y_), m(m_), d(d_) {} void add_day(int n); // declare to add n days int month() {return m;}; // define return month int day() {return d;}; // define return day int year() {return y;}; // define return year };
注:参数名使用y_、m_、d_是为了避免与结构体成员变量y、m、d重名,也可以用this->y = y的方式赋值。
方式2:在struct外部定义构造函数
保持结构体内部的声明不变,在结构体定义之后添加构造函数的定义:
// 结构体定义之后添加构造函数的实现 Date::Date(int y_, int m_, int d_) : y(y_), m(m_), d(d_) {}
或者用普通赋值方式:
Date::Date(int y_, int m_, int d_) { y = y_; m = m_; d = d_; }
额外提示
你的代码中add_day(int n)函数同样只有声明没有定义,如果后续在代码中调用这个函数,会触发相同的链接错误,需要补充对应的函数定义。
内容的提问来源于stack exchange,提问作者cbcalvin
相关产品推荐
相关产品推荐

