Initialize const member variables

后端 未结 4 1869
逝去的感伤
逝去的感伤 2021-01-01 11:47

I have C++ code that boils down to something like the following:

class Foo{
    bool bar;
    bool baz;
    Foo(const void*);
};
Foo::Foo(const void* ptr){
          


        
4条回答
  •  粉色の甜心
    2021-01-01 12:24

    One option is a C++11 delegating constructor, as discussed in other answers. The C++03-compatible method is to use a subobject:

    class Foo{
        struct subobject {
            const bool bar;
            const bool baz;
            subobject(const struct my_struct* s)
                : bar(calculate_bar(s))
                , baz(calculate_baz(s))
            {}
        } subobject;
        Foo(const void*);
    };
    Foo::Foo(const void* ptr)
        : subobject(complex_method(ptr))
    {}
    

    You can make bar and baz const, or make the subobject const, or both.

    If you make only subobject const, then you can calculate complex_method and assign to bar and baz within the constructor of subobject:

    class Foo{
        const struct subobject {
            bool bar;
            bool baz;
            subobject(const void*);
        } subobject;
        Foo(const void*);
    };
    Foo::Foo(const void* ptr)
        : subobject(ptr)
    {}
    Foo::subobject::subobject(const void* ptr){
        const struct my_struct* s = complex_method(ptr);
        bar = calculate_bar(s);
        baz = calculate_baz(s);
    }
    

    The reason that you can't mutate const members within a constructor body is that a constructor body is treated just like any other member function body, for consistency. Note that you can move code from a constructor into a member function for refactoring, and the factored-out member function doesn't need any special treatment.

提交回复
热议问题