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

C++如何在不同类之间正确共享变量值

问题根因

你代码的问题出在Shared.h中对MESSAGE变量的static修饰:
在命名空间作用域下,static关键字的作用是令变量具有内部链接属性,即每个包含了该头文件的编译单元(每个单独编译的.cpp文件,对应你的场景就是Main.cpp和TestClass.cpp),都会生成一份完全独立的MESSAGE变量副本,不同副本之间内存不共享。
这就导致你在TestClass.cpp中修改的是TestClass编译单元持有的那份MESSAGE,而main函数读取的是Main.cpp自己持有的MESSAGE,自然无法感知到另一个副本的修改。

正确实现方案

C++中实现跨类、跨编译单元的全局共享变量,需要遵循「头文件声明、源文件唯一定义」的规则,即可达到和C#公共静态类中静态变量完全一致的全局访问、全局共享效果。

兼容所有C++标准的写法

  1. 修改Shared.h,用extern关键字做变量声明,不要在头文件中初始化:
#pragma once
#include <string>

namespace MyNameSpace
{
    // 仅声明变量存在,具体定义在其他编译单元中
    extern std::string MESSAGE;
}
  1. 新增Shared.cpp文件,在其中做变量的唯一定义与初始化:
#include "Shared.h"

namespace MyNameSpace
{
    // 整个程序中唯一的MESSAGE实例,全局共享
    std::string MESSAGE = "Hello";
}

其余文件(Main.cpp、TestClass.h、TestClass.cpp)不需要做任何改动,重新编译运行即可得到预期输出:

This should print 'Hello'
Print 1 from main: Hello
This should print 'Test message 1'
Print 1 from TestClass: Test message 1
Print 2 from main: Test message 1
This should print 'Test message 2'
Print 3 from main: Test message 2

C++17及以上版本简化写法

如果你使用的编译器支持C++17及更新的标准,可以直接在头文件中用inline修饰变量,无需额外创建.cpp文件做定义,该写法同样保证整个程序中只有一份变量实例:

// Shared.h (仅C++17+可用)
#pragma once
#include <string>

namespace MyNameSpace
{
    inline std::string MESSAGE = "Hello";
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:06:29