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

C++类静态成员赋值报错:Undefined symbols for architecture x86_64: SingleInstance::sm

解决静态成员变量未定义的链接错误

你遇到的这个Undefined symbols for architecture x86_64: "SingleInstance::sm"错误是C++里静态成员变量的典型问题——你只在类内部声明了静态成员sm,但没有在类外部为它分配实际的内存空间(也就是定义它)。

在C++的规则中,类里的静态成员变量只是一个"声明",告诉编译器有这么个变量存在,但内存分配需要在类外部通过"定义"来完成。链接器在编译阶段找不到这个变量的实体,就会抛出未定义符号的错误。

修复方法

你需要在类的外部(全局作用域)添加静态成员变量的定义,推荐顺便初始化它(比如初始化为nullptr,避免野指针隐患):

#include <iostream>
using namespace std;

class SingleInstance {
public:
    static void getInstance() {
        // 加个空指针判断,符合单例模式的核心逻辑
        if (sm == nullptr) {
            sm = new SingleInstance();
            cout << "build new instance" << endl;
        }
    }
private:
    SingleInstance(){}
    ~SingleInstance(){}
    static SingleInstance* sm; // 类内仅做声明
};

// 关键步骤:在类外定义静态成员变量,分配内存
SingleInstance* SingleInstance::sm = nullptr;

int main() {
    SingleInstance::getInstance();
    return 0;
}

额外提示

  1. 不管静态成员变量的访问权限是public还是private,都必须在类外部完成定义
  2. 如果你的类写在头文件中,这个定义一定要放在对应的.cpp文件里,不能放在头文件中(否则会引发重复定义的编译错误)
  3. 我给你的单例逻辑补了if (sm == nullptr)的判断,避免重复创建实例,更贴合单例模式的设计初衷

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:56:26