2017-02-08 69 views
12

Czy jest możliwe, aby przeciążony konstruktor w jakiś sposób wywoływał innego konstruktora w klasie, podobnie do poniższego kodu?Czy istnieje konstruktor wygody w C++?

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

Powyższy kod działa, ale obawiam się, że wywoływanie go w konstruktorze może prowadzić do niezdefiniowanego zachowania.

Jeśli tak, proszę wyjaśnić, dlaczego, a także zaproponować lepszą alternatywę?

+6

Termin szukasz jest delegowanie "konstruktorzy". – nwp

+1

Dlaczego nie 'A (int i): m_str (std :: to_string (i)) {}'? – CoryKramer

+2

To jest minimalny przykład. Chcę przeciążyć konstruktor, który akceptuje 7 parametrów, z których 4 mają wartości domyślne i chcę uniknąć jawnego ustawienia wartości domyślnych w więcej niż jednym miejscu. – Makaronodentro

Odpowiedz

23

C++ 11 wprowadzono delegating constructors:

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

Może być wart tego' m_str (std :: move (str)) '. – juanchopanza

+0

Warto zauważyć, że konstruktor docelowy jest wywoływany przed konstruktorem delegującym, więc w ciele tego ostatniego można założyć, że pierwszy został wywołany. –