类内部的C++常量结构初始化
C++ constant structure initialization inside a class
我应该如何为类编写构造函数来初始化const结构/具有const字段的成员
在下面的例子中,我在结构B中定义了一个构造函数,它可以很好地初始化它的常量字段。
但是,当我尝试使用相同的技术来初始化类A中结构C的常量字段时,它不起作用有人能帮我重写一下我的A级吗
#include <iostream>
class A
{
public:
struct C
{
C (const int _x) : x (_x) {}
const int x;
};
C c (3);
};
int main (int argc, char *argv[])
{
struct B
{
B (const int _x) : x (_x) {}
const int x;
};
B b (2);
std::cout << b.x << std::endl;
A a;
std::cout << a.c.x << std::endl;
return 0;
}
p.S.
我做了一些搜索,我想,我理解,除非我有C++11支持或想使用boost库,否则我必须定义一个助手函数来初始化初始化列表中的const结构(C++常量结构成员初始化)但我必须定义类似的结构,但用非常量字段来初始化带有常量字段的结构,这似乎很疯狂,不是吗?
我发现的另一件事告诉我应该在类a的构造函数中初始化const成员,而不是在结构C的构造函数中(C++编译时错误:数值常量之前的预期标识符),但这对我来说似乎也很疯狂,因为为什么每次我想添加新结构时都要重写类构造函数,为类a中的每个结构C都有一个单独的构造函数不是更方便吗?
如果有任何意见可以澄清我的困惑,我将不胜感激。
我会这样做:
#include <iostream>
class A {
public:
struct C {
C(const int _x) : x(_x) {}
const int x;
};
C c; // (3);
A() : c(3) {}
};
int main(int argc, char *argv []) {
A a;
std::cout << a.c.x << std::endl;
return 0;
}
请注意,这不是在A
中使用ctor或在C
中使用的问题,而是A
的ctor告诉如何调用C
的ctor的问题。如果将要传递的值始终是3
,那么这是不必要的,但我假设您希望在创建C
对象时能够传递您选择的值,并且在此之后它将保持不变。
如果该值始终相同(在这种情况下为3
),则可以通过使常数static
:来简化很多事情
struct A {
struct C {
static const int x = 3;
};
C c;
};
int main() {
A a;
std::cout << a.c.x << "n";
}
因此,如果该类的所有实例的值都相同,则将其设为static const
,在适当的位置对其进行初始化,这样生活就很好了。如果在创建对象的实例之前该值是未知的,并且此后在该对象的生命周期内保持不变,则需要通过构造函数传递该值。
对于稍微不同的情况,还有第三种可能性:如果C
是一个独立的类(不嵌套在A
内部),则可能会出现C
的其他实例使用不同值,但A
内部的C
的所有实例始终使用相同值的情况。在这种情况下,您可以执行以下操作:
struct C {
const int x;
C(int x) : x(x) {}
};
struct A {
C c;
A() : c(3) {}
};
当然,当C
嵌套在A
中时,也可以执行同样的操作,但当/如果执行此操作,通常意味着为C
的所有实例设置相同的值,因此不妨使用static const
方法。如果A
有多个构造函数,那么(例如)A
的默认构造函数为C::x
传递了一个值,而其复制构造函数传递了另一个值。
- 多成员Constexpr结构初始化
- 为什么用结构初始化数组需要指定结构名称
- 使用指定的初始值设定项聚合匿名结构初始化
- 不同的类或结构初始化方法之间的性能差异是什么?
- 如何在结构初始化中获取成员C++
- C++正确的结构初始化
- 使用大括号进行结构初始化
- 内部结构初始化不起作用 - C++
- 使用嵌套结构初始化并集
- 使用匿名结构初始化联合
- 结构初始化语法
- 结构初始化的 C++ 向量
- C++嵌套结构初始化和访问成员
- 结构初始化中的常量正确性
- 使用 C++ 中的自定义元素进行 Const 结构初始化
- 如何在结构C++初始化内置数组
- Visual C++ 模板类成员结构初始化语法糖
- C++结构初始化
- C 在结构初始化过程中带有内部阵列的奇怪错误
- 此C/C 的结构初始化器如何使用足够的字段工作