【问题标题】:Initialize struct with (shadowed) base-class data members in C++11在 C++11 中使用(阴影)基类数据成员初始化结构
【发布时间】:2021-12-03 14:35:35
【问题描述】:

可以将成员添加到派生的structshadow 基类的同名成员,无论这是否是错误,another Q&A 解决了这个问题。我的问题是关于初始化隐藏的继承成员。 is-a 关系允许将派生的D 按值分配给基类B,但是很难初始化与基类对应的继承成员。在下面的示例中,初始化是使用 B 的大括号括起来的初始化列表完成的,但对于 D 是不可能的。我发现获得已定义 D 实例的唯一选择是默认初始化(零)并随后分配:

#include <iostream>
using namespace std;

int main()
{
    struct B { int x; };
    struct D: B { int x; };
    B bas = {1};
    cout << bas.x << endl;
    D der = {};
    der.x = 2;
    bas = der;
    cout << bas.x << endl;
    der.B::x = 3;
    bas = der;
    cout << bas.x << endl;
    static_cast<B&>(der).x = 4;
    bas = der;
    cout << bas.x << endl;
    return 0;
}

输出:

1
0
3
4

我认为可能可行的以下想法导致了编译器错误:

    D der = {1, 2};

错误:无法将 '{1, 2}' 从 '' 转换为 'main()::D'

    D der = {B::x=1, 2};

错误:非静态数据成员'main()::B::x'的使用无效

错误:无法将 '{, 2}' 从 '' 转换为 'main()::D'

g++.exe -Weffc++ -pedantic -Wextra -Wall -std=gnu++11 -std=c++11 -fexceptions -g -std=c++11 使用 gcc 8.1.0)

有没有办法在 C++11 中正确初始化?

附录:
当我问这个问题时,我非常关注访问影子成员的困难,以至于我完全错过了 C++11 中 aggregate initialization 的有限选项。所以这个问题的答案也适用于没有隐藏数据成员的派生类。

【问题讨论】:

  • 添加一个带有两个参数的D 构造函数?

标签: c++ c++11 inheritance initialization shadowing


【解决方案1】:

D der = {1, 2} 可以在 C++17 中工作,因为

D der = {{42}, 2};

Demo

对于以前的版本,你不能像这样初始化 base,你需要一个构造函数。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2019-04-04
相关资源
最近更新 更多