2017-02-08 1 views
12

Kann ein überladener Konstruktor irgendwie einen anderen Konstruktor innerhalb der Klasse aufrufen, ähnlich dem folgenden Code?Gibt es in C++ einen Convenience-Konstruktor?

class A { 
public: 
    A(std::string str) : m_str(str) {} 
    A(int i) { *this = std::move(A(std::to_string(i))); } 

    std::string m_str; 
}; 

Der obige Code funktioniert, aber ich habe Angst, dass das Aufrufen dieses im Konstruktor zu undefiniertem Verhalten führen kann.

Wenn ja, könnten Sie bitte erklären warum und schlagen Sie auch eine bessere Alternative vor?

+6

Der Begriff Sie suchen, ist "delegieren Bauer". – nwp

+1

Warum nicht? A (int i): m_str (std :: to_string (i)) {} '? – CoryKramer

+2

Dies ist ein minimales Beispiel. Ich möchte einen Konstruktor überladen, der 7 Parameter akzeptiert, von denen 4 Standardwerte haben, und ich möchte es vermeiden, die Standardwerte explizit an mehr als einem Ort festzulegen. – Makaronodentro

Antwort

23

C++ 11 delegating constructors eingeführt:

class A 
    { 
    public: 
    std::string m_str; 
    A(std::string str) : m_str(str) {} // target constructor 
    A(int i) : A(std::to_string(i)) {} // delegating constructor 
    }; 
+7

Könnte es wert sein,' m_str (std :: move (str)) ''. – juanchopanza

+0

Es ist vielleicht erwähnenswert, dass der Zielkonstruktor vor dem delegierenden Konstruktor aufgerufen wird, also können Sie im Hauptteil davon annehmen, dass der erste Konstruktor aufgerufen wurde. –

Verwandte Themen