C++如何定义可传递给其他类的类全局零初始化对象
解决方案
核心思路:通过模板全局变量实现针对任意类型T的唯一零初始化number<T>全局实例,该实例生命周期和程序运行周期一致,可安全绑定到引用成员。
完整修改代码
1. header1.hpp
给number类添加默认构造函数保证零初始化,同时定义全局默认零实例:
//header1.hpp template<class T> class number{ public: // 默认构造:值初始化number_,保证成员零初始化 number():number_(){} // 保留原有构造函数 number(T& val):number_(val){}; T number_; }; // 全局零初始化number实例,inline修饰避免多编译单元重复定义问题 template<typename T> inline number<T> zero_number{};
2. header2.hpp
修复原代码语法错误,替换?为全局零实例:
//header2.hpp #include "header1.hpp" template<class T> class twiceNumber{ public: // 修复拼写错误:publice -> public // 委托构造,绑定全局零实例 twiceNumber ():twiceNumber(zero_number<T>){} twiceNumber(number<T>& m):n(m){} // 修复语法错误:移除多余分号 number<T>& n; }; // 修复语法错误:类定义末尾补充分号
3. main.cpp
引入必要头文件即可正常运行:
//main.cpp #include<iostream> #include "header2.hpp" int main(){ twiceNumber<double> tryTwice; // 输出结果为0,符合零初始化预期 std::cout<<tryTwice.n.number_<<"\n"; return 0; }
低版本C++兼容方案
如果使用的C++版本低于17,不支持inline模板变量,可以把全局零实例改成number类的静态成员:
- 在header1.hpp的
number类内部添加静态成员声明:
template<class T> class number{ public: number():number_(){} number(T& val):number_(val){}; T number_; // 静态默认零实例声明 static number zero; }; // 类外定义静态成员 template<typename T> number<T> number<T>::zero{};
- 把header2.hpp的默认构造改为:
twiceNumber ():twiceNumber(number<T>::zero){}
内容的提问来源于stack exchange,提问作者Al-Farouq
相关产品推荐
相关产品推荐

