c++ - 使用临时初始化多个成员

标签 c++ constructor initialization-list

在旧的 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() 是一个非常重量级的调用,我真的不认为在不需要时调用它两次是个好主意。

注意 正在初始化的三个对象都没有默认构造函数,因此在函数体中进行初始化并不是一个真正的选择。

我们怎么看?我有什么好的方法可以做到这一点,还是应该切换到智能指针并动态分配我包含的对象?

最佳答案

自 C++11 起,您可以使用委托(delegate)构造函数:

class ScaleDownEffect
{
     ScaleDownEffect(const TargetImage& targetImage,
                     const std::vector<std::string>& shaders)
     : m_renderTarget(targetImage),
       m_firstPassShader(shaders[0],
                         m_renderTarget.getWidth()  / 2,
                         m_renderTarget.getHeight() / 2),
       m_secondPassShader(shaders[1],
                          m_renderTarget.getWidth() / 4,
                          m_renderTarget.getHeight() / 4)
     {}

public:
    ScaleDownEffect(const TargetImage& targetImage)
        : ScaleDownEffect(targetImage,
                          compileShaders(ScaleDownEffectShaderSource,
                                         targetImage.getLayout())) 
    {
    }

private:
    RenderTarget m_renderTarget;
    Shader m_firstPassShader;
    Shader m_secondPassShader;
};

关于c++ - 使用临时初始化多个成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48345273/

相关文章:

c++ - 对 C++ 中头文件的实际用途感到困惑

c++ - 尝试按值从 vector 中删除元素

c++ - 如何绘制禁用图标

javascript - 销毁构造函数实例

c++ - 使用初始值设定项列表中较早初始化的成员来初始化成员是否安全?

C++ 构造函数初始化列表异常

c++11 默认初始化/值初始化/直接初始化

c++ - 如何遍历 const vector<glm::vec3>

types - Isabelle:对于构造函数使用公理化和数据类型有区别吗

c++ - 使用初始化列表初始化父级的 protected 成员 (C++)