[英]Using Designated Initializer on member of inherited base class
我创建了一个包含成员变量的类Something
。
我能够做到这一点,它按预期工作:
struct Something
{
bool Works;
};
int main()
{
Something s = {
.Works = false,
};
}
现在,我想创建一个继承自Something
的结构,命名为Something2
,并想做同样的事情,但我希望能够访问Something::Works
(我将其重命名为DoesntWork
,因为它不起作用! ):
struct Something
{
bool DoesntWork;
};
struct Something2 : public Something
{
bool Works;
};
int main()
{
Something2 s2 = {
.Works = true,
.DoesntWork = false,
};
}
https://godbolt.org/z/rYT3br467
我不是在寻找替代方案,我已经可以想到一些。 我只是想知道这是否可能,如果是,那么如何。
如果不可能,我很想知道低级原因,所以不要犹豫!
更新:感谢 Nathan Oliver 的评论,您可以阅读: C++20 中的指定初始化程序
在指定初始化器方面,C++比C 严格得多。
参考:
乱序指定初始化、嵌套指定初始化、指定初始化和常规初始化混合、数组的指定初始化在C编程语言中都是支持的,但在C++中是不允许的。
C 根本没有继承概念,这使得 C 的指定版本(至少在 C++20 之前)是不可能的。 一种可能的未来版本是在具有委托构造函数的构造函数中将其指定为“向前”。 在这种情况下,我希望正确的初始化是这样的:
Something2 s2 = {
Something = {
.Works = false
},
.DoesntWorks = true
};
然而,从 C++20 开始,这不是 C++ 的一部分。 但是,您可以在 C++ 中创建构造函数来满足(部分)您的需求,而无需指定初始值设定项:
struct Something {
bool DoesntWork;
};
struct Something2 : public Something {
Something2(bool Doesnt, bool Does) :
Something{Doesnt},
Works{Does}
{}
bool Works;
};
int main() {
Something2 s2
{
true, false
};
}
或者在没有用户定义的构造函数的情况下初始化每个对象:
struct Something {
bool DoesntWork;
};
struct Something2 : public Something {
bool Works;
};
int main() {
Something2 s2{
// You could just make it `{true}` below, but mentioning the
// subobject fits the purpose of a designated initializer for clarity:
Something{true},
// this must however be left unmentioned in C++20 since you can't
// mix regular initializers with designated ones:
false
};
}
这对我有用:
struct Something
{
bool ThisWorks;
};
struct Something2 : Something
{
bool Works;
};
int main()
{
Something2 s2 = {
{ .ThisWorks = false },
.Works = true
};
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.