类内部的C++常量结构初始化

C++ constant structure initialization inside a class

本文关键字:结构 初始化 常量 C++ 内部      更新时间:2023-10-16

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

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

  2. 我发现的另一件事告诉我应该在类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传递了一个值,而其复制构造函数传递了另一个值。