【问题标题】:On C++ constructors关于 C++ 构造函数
【发布时间】:2021-11-15 17:21:46
【问题描述】:

我在一个游戏的开源实现中找到了以下代码。

struct Renderable {
    std::shared_ptr<UniformInput> uniform;
    std::shared_ptr<Geometry> geometry;
    bool alpha_blending = true;
    bool depth_test = true;
};


struct ShaderUpdate : Renderable {
    ShaderUpdate(std::shared_ptr<UniformInput> const& uniform)
        : Renderable{uniform, nullptr} {}

    ShaderUpdate(std::shared_ptr<UniformInput> && uniform)
        : Renderable{std::move(uniform), nullptr} {}
};

ShaderUpdate 继承自 'Renderable' 并在对象创建期间调用其基类构造函数。但是“Renderable”没有定义 2 参数构造函数。结构中“初始化”值的存在与此有关吗?

【问题讨论】:

  • 使用大括号而不是圆括号很重要。搜索“统一初始化”。
  • 换句话说,Renderable 没有定义 2 参数构造函数或任何构造函数是完全可以的,因为 ShaderUpdate 没有调用 Renderable 的任何构造函数.花括号确实 not 表示调用构造函数。
  • 我花了一些时间来解决这个问题。这种形式的初始化列表称为Aggregate Initialization。不过,这样的构造感觉很可疑……我更喜欢定义适当的构造函数而不是这样做。 @molbdnilo,MikeNakis 你会推荐它吗?我读到这解决了 C++11 之前的初始化中的歧义。

标签: c++ default-constructor


【解决方案1】:

实际上这里发生的事情是 Renderable 被默认构造,然后设置 uniform 和 geometry 的值。编译器生成默认构造函数,然后您只需设置值。我猜您使用的是 c++14/11 或更高版本,否则这将无法正常工作,因为旧的 c++ 版本不允许这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2014-06-13
    相关资源
    最近更新 更多