You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何出现链接器错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 08:32:20