在较旧的C 98中,我不相信有任何好方法可以在初始化程序列表中重用临时结果来初始化对象的多个成员.
在较新版本的C(11,14,17)中有没有改变?
请考虑以下代码:
// // compileShaders() // // Takes a string containing the source code to possibly hundreds of shaders // for an effect (In this case,there are only 2 shaders for this effect) // // Returns a vector of compiled bytecode for each shader in the effect // std::vector<std::string> compileShaders( const std::string& sourceCode,const RenderTargetLayout& layout); // // class ScaleDownEffect // // Scales image to 1/4 in each dimension by using two 1/2 passes // class ScaleDownEffect { public: ScaleDownEffect(const TargetImage& targetImage) : m_renderTarget(targetImage),m_firstPassShader( compileShaders( ScaleDownEffectShaderSource,m_renderTarget.getLayout() )[0],m_renderTarget.getWidth() / 2,m_renderTarget.getHeight() / 2 ),m_secondPassShader( compileShaders( ScaleDownEffectShaderSource,m_renderTarget.getLayout() )[1],m_renderTarget.getWidth() / 4,m_renderTarget.getHeight() / 4 ) { } private: RenderTarget m_renderTarget; Shader m_firstPassShader; Shader m_secondPassShader; };
compileShaders()是一个非常重量级的调用,我真的不认为在我不需要的时候调用它两次是个好主意.
注意初始化的三个对象都没有默认ctors,因此在函数体中执行它不是一个真正的选项.
我们怎么想?有没有什么好办法让我这样做,或者我应该切换到智能指针并动态分配我包含的对象?
解决方法
您可以使用嵌套类型:
class ScaleDownEffect { struct Shaders { explicit Shaders(const std::vector<std::string>& s,unsigned int w,unsigned int h) : m_firstPassShader( s[0],w / 2,h / 2 ),m_secondPassShader( s[1],w / 4,h / 4 ) {} Shader m_firstPassShader; Shader m_secondPassShader; }; RenderTarget m_renderTarget; Shaders m_shaders; public: ScaleDownEffect(const TargetImage& targetImage) : m_renderTarget(targetImage),m_shaders(compileShaders(ScaleDownEffectShaderSource,m_renderTarget.getLayout()),m_renderTarget.getWidth(),m_renderTarget.getHeight()) { } };
您还可以将对m_renderTarget的引用传递给嵌套类型的c’tor而不是宽度和高度(我只假设它是unsigned int,btw类型).
有一个缺点是你现在需要访问第一个通道着色器,例如作为m_shaders.m_firstPassShader.我建议添加(内联)getter方法,即使它们返回引用,即使它们是私有的,也可以使用着色器将代码与存储方式的更改隔离开来.