类中的C ++常量结构初始化

时间:2013-07-04 16:00:41

标签: c++

我应该如何编写一个类的构造函数来初始化一个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。

  1. 我做了一些搜索,我想,我知道,除非我有C ++ 11支持或想要使用boost库,否则我必须定义一个辅助函数来初始化初始化列表中的const结构 (C++ Constant structure member initialization) 但是我必须定义相似的结构似乎很疯狂,但是使用非const字段来初始化带有const字段的结构,不是吗?

  2. 我发现的另一件事告诉我应该在类A的构造函数中初始化const成员,而不是在结构C(C++ compile time error: expected identifier before numeric constant)的构造函数中初始化,但它对我来说似乎也很疯狂,因为每次我想添加一个新结构时,为什么要重写一个类构造函数,为A类中的每个结构C设置一个单独的构造函数是否更方便呢?

  3. 如果有任何意见可以澄清我的困惑,我将不胜感激。

1 个答案:

答案 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;
}

请注意,这不是AC 中使用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的其他实例使用的情况各种值,但CC的所有实例始终使用相同的值。在这种情况下,您可以执行以下操作:

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传递了一个值,并且其复制构造函数传递了不同的值。