有没有办法在继承构造函数时访问初始值设定项列表
Is there a way to access the initializer list when inheriting constructors?
我目前正在研究一个类层次结构,其中类B
继承自A
并使用C++的功能,该功能允许通过键入直接继承构造函数:
using A::A;
而是复制所有现有的构造函数。有没有办法初始化类B
的类属性,否则将由初始化列表初始化?
类层次结构如下所示,不使用构造函数继承,并且可以很好地编译:
class A
{
public:
A (int a)
{}
};
class B
:
public A
{
public:
B (int a)
:
A(a),
blubb(a)
{}
float blubb;
};
使用构造函数继承和Revolver_Ocelot建议的答案,代码如下所示:
class A
{
public:
A (int a)
{}
};
class B
:
public A
{
public:
using A::A;
float blubb {a};
};
这给出了以下编译时错误消息:
foo.cpp:21:22: error: ‘a’ was not declared in this scope
float blubb {a};
^
foo.cpp:21:23: error: cannot convert ‘<brace-enclosed initializer list>’ to ‘float’ in initialization
float blubb {a};
^
在 C++11 中,您可以通过大括号或等于初始化器来初始化类变量,否则成员将默认初始化:
class B : public A
{
using A::A;
MyComplexType foo {ConstructorArgument1, ConstructorArgument2};
};
编辑:由于新情况,我将添加新信息。
如果您提到,没有其他选择,如果您想访问基类构造函数参数,则可以使用您想要的签名创建自己的构造函数。但是,这并不意味着您必须复制代码。相反,您可以将大部分工作委托给基类构造函数,仅将类 B 的内容保留在类 B 中:
class B : public A
{
public:
using A::A;
B(int a) : A(a), blubb(a)
{}
float blubb;
};
如果使用构造函数参数初始化类 A 中的某个成员,并且派生类有权访问该成员,则可以使用该成员初始化派生类成员:
class A
{
protected:
int y;
public:
A(int a) : y(a)
{}
};
class B : public A
{
int z {y};
public:
using A::A;
};
相关文章:
- 访问类lintalizer列表中的结构元素
- 从C++中的对列表中访问特定元素
- 访问动态分配列表中的元素
- 在C++中循环访问自定义结构列表的小问题
- 访问列表中的所有 std::变体,并为每次访问捕获附加值
- 访问列表向量中的结构
- c++ 循环访问对象列表并删除对象
- 循环访问对象列表 c++
- 在 c++ 中访问列表向量时出现问题
- 在 DLL 中嵌入 Python:Py_DECREF列表对象时访问冲突读取位置
- 对C++列表的基于索引的访问
- C++娜娜 如何从全局列表框*指针访问列表框内的索引 0 上的按钮?
- 创建类型列表并访问每种类型的静态成员?
- 在为工作线程访问 lambda 中捕获的向量列表中的元素引用时,是否需要互斥锁?
- 如何合并两个双重链接列表(访问下一个链接)
- 读取访问违规当前为0xCDCDCDCD,链接列表窗口
- 能够访问逐项列表的最佳结构
- 访问链表中的结构(带有指向其子实现的指针列表的树)
- 如何在C++中访问标准::列表中的函数
- STL列表访问倒数第二个元素