构造具有 const 成员的对象时调用另一个构造函数

jtb*_*des 5 c++ constructor constants

我有一个带const成员的类,一个构造函数调用另一个填充了额外值的构造函数。通常我可以为此使用冒号初始值设定项,但该函数很复杂(类似printf/ sprintf)并且需要我在堆栈上使用一个变量,所以我必须在构造函数的主体中执行此操作并使用分配*this给新对象。但当然这是无效的,因为我的成员变量是const.

class A
{
public:
    A(int b) : b(b), c(0), d(0) // required because const
    {
        int newC = 0;
        int newD = 0;
        myfunc(b, &newC, &newD);
        *this = A(b, newC, newD); // invalid because members are const

        // "cannot define the implicit default assignment operator for 'A', because non-static const member 'b' can't use default assignment operator"
        // or, sometimes,
        // "error: overload resolution selected implicitly-deleted copy assignment operator"
    };
    A(int b, int c, int d) : b(b), c(c), d(d) { };

    const int b;
    const int c;
    const int d;
};

A a(0);
Run Code Online (Sandbox Code Playgroud)

(我没有明确删除赋值运算符。)我声明了成员 const,因为我希望它们是公开的,但不是可变的。

是否有一些规范的方法可以在不使用可怕的演员表和强制覆盖成员的情况下解决这个问题const?这里最好的解决方案是什么?

eca*_*mur 2

您可以添加参数类并使用 C++11 构造函数委托或基类:

struct parameters {
    int b; int c; int d;
    parameters(int b): b(b), c(), d() {
        myfunc(b, &c, &d);
    }
};

// constructor delegation
class A {
public:
    A(int b): A(parameters(b)) { }
    A(parameters p): b(p.b), c(p.c), d(p.d) { }
};

// base/wrapper
class ABase {
    ABase(parameters p): b(p.b), c(p.c), d(p.d) { }
};

class A: public ABase {
public:
    A(int b): ABase(parameters(b)) { }
};
Run Code Online (Sandbox Code Playgroud)