C++如何在不同类之间正确共享变量值
问题根因
你代码的问题出在Shared.h中对MESSAGE变量的static修饰:
在命名空间作用域下,static关键字的作用是令变量具有内部链接属性,即每个包含了该头文件的编译单元(每个单独编译的.cpp文件,对应你的场景就是Main.cpp和TestClass.cpp),都会生成一份完全独立的MESSAGE变量副本,不同副本之间内存不共享。
这就导致你在TestClass.cpp中修改的是TestClass编译单元持有的那份MESSAGE,而main函数读取的是Main.cpp自己持有的MESSAGE,自然无法感知到另一个副本的修改。
正确实现方案
C++中实现跨类、跨编译单元的全局共享变量,需要遵循「头文件声明、源文件唯一定义」的规则,即可达到和C#公共静态类中静态变量完全一致的全局访问、全局共享效果。
兼容所有C++标准的写法
- 修改
Shared.h,用extern关键字做变量声明,不要在头文件中初始化:
#pragma once #include <string> namespace MyNameSpace { // 仅声明变量存在,具体定义在其他编译单元中 extern std::string MESSAGE; }
- 新增
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
相关产品推荐
相关产品推荐

