Aufruf eines anderen Konstruktors beim Erstellen eines Objekts mit const-Mitgliedern

Ich habe eine Klasse mitconst Member und ein Konstruktor, der einen anderen Konstruktor mit zusätzlichen Werten aufruft. Normalerweise könnte ich dafür einen Doppelpunkt-Initialisierer verwenden, aber die Funktion ist komplex (printf/sprintf-like) und erfordert, dass ich eine Variable auf dem Stapel verwende, also muss ich dies im Rumpf des Konstruktors tun und zuweisen*this zum neuen Objekt. Aber das ist natürlich ungültig, weil meine Mitgliedsvariablen es sindconst.

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

(Ich habe den Zuweisungsoperator nicht explizit gelöscht.) Ich habe die Mitglieder const deklariert, weil ich möchte, dass sie öffentlich sind, aber nicht veränderbar.

Gibt es einen kanonischen Weg, um dieses Problem zu lösen, ohne gruselige Gipsabdrücke zu verwenden und die Mitglieder mit Gewalt zu überschreiben?constNess? Was ist hier die beste Lösung?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage