使用临时初始化多个成员
Using a temporary to initialize multiple members
在较旧的 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,因此在函数主体中执行此操作实际上不是一个选项。
我们怎么看?有什么好方法可以做到这一点,或者我应该切换到智能指针并动态分配我包含的对象?
从 C++11 开始,您可以使用委托构造函数:
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;
};
您可以使用嵌套类型:
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
,顺便说一句(。
有一个缺点,即您现在需要访问第一个通道着色器,例如作为m_shaders.m_firstPassShader
。我建议添加(内联(getter 方法,即使它们返回引用,即使它们是私有的,也可以使用着色器将代码与存储方式的更改隔离开来。
相关文章:
- C++成员初始化
- c++构造函数成员初始化:传递参数
- C++正确的指针成员初始化
- 将另一个类的对象传递到当前类C++的构造函数中(不是成员初始化)
- WinLamb 错误:成员初始化非法
- 使用其他成员初始化结构的成员?
- C++模板类静态成员初始化
- 解释了构造函数成员初始化列表
- 如何在成员初始化列表中声明共享指针
- C++入门5版:使用get成员初始化另一个与shared_ptr无关的对象
- C++11 默认类成员初始化与初始值设定项列表同时
- 调用非默认构造函数作为成员初始化
- C++模板成员初始化:用右值移动构造,但用左值移动引用
- 类成员初始化C++
- 在成员初始化列表中,我可以创建对列表中不在列表中的成员变量的引用
- C :(不重复)积分静态成员初始化(不仅是声明!),导致链接器错误,原因
- 如何调用成员初始化器列表中参考成员的构造函数
- C 构造函数采用成员初始化器
- 与其他静态const成员初始化静态常量成员
- 静态内联成员初始化顺序