C++技术问题:如何用头文件函数初始化类的const成员变量?
C++ const成员变量初始化解决方案
问题说明
将VBufferObject类的bufferSignature成员从unsigned int改为const std::string,要求每个实例创建时,通过SceneManager命名空间下的GenerateAlphanumSignature()函数返回值初始化该const变量。但直接在类内初始化失败,且无法在构造函数体内为const成员赋值,需解决该初始化问题。
原代码片段:
#pragma once #include "Dependencies.h" #include "Helpers.h" #include "SceneManager.h" namespace Vega { class VBufferObject { public: const std::string bufferSignature = SceneManager::GenerateAlphanumSignature(); void ComputeIndexArray(); std::vector<unsigned int> IBD; std::vector<glm::vec3> VBD; std::vector<glm::vec2> UVBD; std::vector<glm::vec3> NBD; }; }
解决办法
构造函数初始化列表(推荐方案)
C++规定const成员变量必须在构造函数的初始化列表中完成初始化,无法在构造函数体内赋值。只需为VBufferObject添加构造函数,在初始化列表中调用GenerateAlphanumSignature()即可:
修改后的头文件代码:
#pragma once #include "Dependencies.h" #include "Helpers.h" #include "SceneManager.h" namespace Vega { class VBufferObject { public: const std::string bufferSignature; // 通过初始化列表初始化const成员 VBufferObject() : bufferSignature(SceneManager::GenerateAlphanumSignature()) {} void ComputeIndexArray(); std::vector<unsigned int> IBD; std::vector<glm::vec3> VBD; std::vector<glm::vec2> UVBD; std::vector<glm::vec3> NBD; }; }
每个VBufferObject实例创建时,会自动调用GenerateAlphanumSignature()生成签名,完成const成员的初始化,完全符合需求。
关于类内直接初始化的说明
如果尝试保留类内初始化的写法,要求SceneManager::GenerateAlphanumSignature()必须是constexpr函数(C++11及以后),但由于该函数返回的是随机生成的字符串,显然无法满足constexpr的要求(常量表达式需在编译期确定结果),因此该方案不可行。构造函数初始化列表是唯一可行的解决方式。
内容的提问来源于stack exchange,提问作者user21385848
相关产品推荐
相关产品推荐

