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

C++外部User类实现报错:未定义引用问题求助

问题描述

尝试通过外部C++文件实现自定义User类,在同一目录下创建了User.h、User.cpp和main.cpp,代码如下:

./User.h

#include <string>

class User {
    public:
        User(std::string username, std::string password);
        std::string getPassword();
        std::string username;

    private:
        std::string password;
};

./User.cpp

#include "User.h"

User::User(std::string username, std::string password) {
    this -> username = username;
    this -> password = password;
}
std::string User::getPassword() {
    return password;
}

./main.cpp

#include <iostream>
#include "User.h"

int main() {
    User eve("Eve3033", "Pass1234");
    std::cout << eve.getPassword();
    return 0;
}

使用g++编译时出现以下链接错误:

undefined reference to `User::User(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
C:\Users\wise-\AppData\Local\Temp\ccQgLvm9.o:main.cpp:(.text+0xb8): undefined reference to `User::getPassword[abi:cxx11]()' collect2.exe: error: ld returned 1 exit status

移除std::string User::getPassword()方法后可正常编译,能创建User实例并访问public的username属性,但重新实现该方法时会触发相同错误。

解决思路

这类错误属于链接阶段错误,并非语法问题,核心是编译器找不到类成员函数的实现代码。可按以下步骤解决:

  • 编译时需将所有相关的.cpp文件一起传入g++命令,不能仅编译main.cpp。正确命令示例:

    g++ main.cpp User.cpp -o program
    

    该命令会同时编译两个源文件,再将生成的目标文件链接为可执行程序program。

  • 若偏好分步编译,可先单独生成每个源文件的目标文件,再统一链接:

    g++ -c main.cpp  # 生成main.o目标文件
    g++ -c User.cpp  # 生成User.o目标文件
    g++ main.o User.o -o program  # 链接生成可执行文件
    
  • 核对函数签名一致性:确保User.cpp中函数的参数类型、返回值类型,与User.h中的声明完全匹配,避免因拼写或类型差异导致链接失败。

  • 确认文件路径正确性:所有文件需在同一编译目录下,若文件分布在不同目录,需用-I参数指定头文件路径,同时正确引用.cpp文件的完整路径。

内容的提问来源于stack exchange,提问作者user21068478

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:55:16