0

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

附言

  1. 我做了一些搜索,我认为,我理解,除非我有 C++11 支持或想要使用 boost 库,否则我必须定义一个辅助函数来初始化初始化列表中的 const 结构(C++ 常量结构成员初始化)但是我必须定义类似的结构似乎很疯狂,但是使用非 const 字段来初始化具有 const 字段的结构,不是吗?

  2. 我发现的另一件事告诉我应该在 A 类的构造函数中初始化 const 成员,而不是在 struct C 的构造函数中初始化(C++ 编译时错误:数字常量之前的预期标识符),但这对我来说似乎也很疯狂,因为为什么每次要添加新结构时都要重写类构造函数,为类A中的每个结构C都有一个单独的构造函数不是更方便吗?

我将不胜感激任何可能澄清我的困惑的评论。

4

1 回答 1

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

请注意,这不是使用 ctor inA in 的问题C,而是使用 ctor 来A告诉C应该如何调用 ctor for 的问题。如果将始终传递的值是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";
}

因此,如果该类的所有实例的值都相同,则 make it static const,将其初始化到位,这样就很好了。如果在创建对象实例之前该值是未知的,并且此后在该对象的生命周期内保持不变,则需要通过构造函数将其传递。

对于稍微不同的情况,还有第三种可能性:如果C是一个独立的类(不嵌套在内部A),您可能会遇到其他实例C使用不同值的情况,但C内部的所有实例A总是使用相同的值。在这种情况下,您会执行以下操作:

struct C { 
    const int x;

    C(int x) : x(x) {}
};

struct A { 
     C c;

     A() : c(3) {}
};

当然,当嵌套在 中时,你可以做同样的事情,但是当/如果你这样做,这通常意味着你为所有实例设置相同的值,所以你不妨改用这种方法。明显的例外是如果有多个构造函数,因此(例如)的默认构造函数传递了一个值,而其复制构造函数传递了一个不同的值。CACstatic constAAC::x

于 2013-07-04T16:20:37.833 回答