我应该如何编写一个类的构造函数来初始化一个const结构/具有const字段的成员?
在下面的例子中,我在结构B中定义了一个构造函数,它可以很好地初始化它的const字段。
但是当我尝试使用相同的技术初始化A类中结构C的const字段时,它不起作用。 有人可以帮助我并以某种方式改写我的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++ Constant structure member initialization) 但是我必须定义相似的结构似乎很疯狂,但是使用非const字段来初始化带有const字段的结构,不是吗?
我发现的另一件事告诉我应该在类A的构造函数中初始化const成员,而不是在结构C(C++ compile time error: expected identifier before numeric constant)的构造函数中初始化,但它对我来说似乎也很疯狂,因为每次我想添加一个新结构时,为什么要重写一个类构造函数,为A类中的每个结构C设置一个单独的构造函数是否更方便呢?
如果有任何意见可以澄清我的困惑,我将不胜感激。
答案 0 :(得分:4)
我会做这样的工作:
#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
中C
或中使用ctor的问题,而是A
的ctor使用ctor来告诉{应该调用{1}}。如果将传递的值始终为C
,那么这不是必需的,但我假设您希望能够在创建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
内C
的所有实例始终使用相同的值。在这种情况下,您可以执行以下操作:
A
当然,当struct C {
const int x;
C(int x) : x(x) {}
};
struct A {
C c;
A() : c(3) {}
};
嵌套在C
内时,你可以做同样的事情,但是当你这样做时,它通常意味着你正在设置A
的所有实例的值相同,因此您也可以使用C
方法。明显的例外是static const
有多个构造函数,因此(例如)A
的默认构造函数为A
传递了一个值,并且其复制构造函数传递了不同的值。