2017-02-08 20 views
12

오버로드 된 생성자가 어떻게 든 클래스 내의 다른 생성자를 호출 할 수 있습니까? 아래 코드와 유사합니까?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; 
}; 

위의 코드는 작동하지만 아직 생성자에서이를 호출하면 정의되지 않은 동작이 발생할 수 있습니다.

왜 그런지 설명하고 더 나은 대안을 제안 할 수 있습니까?

+6

당신이 찾고있는 용어는 "위임 생성자"입니다. – nwp

+1

왜'A (int i) : m_str (std :: to_string (i)) {}'인가? – CoryKramer

+2

이것은 최소한의 예입니다. 나는 7 개의 매개 변수를 받아들이는 생성자를 오버로드하고 싶습니다. 그 중 4 개는 기본값을 가지며 두 개 이상의 장소에서 기본값을 명시 적으로 설정하지 않으려합니다. – Makaronodentro

답변

23

C++ (11)는 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

'm_str (std :: move (str))'에 가치가 있을지도 모른다. – juanchopanza

+0

대상 생성자가 위임 생성자보다 먼저 호출되므로주의해야합니다. 따라서 후자의 본문에서 이전 생성자가 호출되었다고 가정 할 수 있습니다. –