2017-02-08 16 views
12

Có thể cho một nhà xây dựng quá tải bằng cách nào đó gọi một hàm tạo khác trong lớp, tương tự như mã dưới đây không?Có một hàm tạo thuận tiện trong C++ không?

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

Mã trên hoạt động, nhưng tôi sợ rằng việc gọi hàm này trong hàm tạo có thể dẫn đến hành vi không xác định.

Nếu có thể bạn vui lòng giải thích lý do và cũng đề xuất giải pháp thay thế tốt hơn?

+6

Thuật ngữ mà bạn đang tìm kiếm là "nhà xây dựng đại biểu". – nwp

+1

Tại sao không 'A (int i): m_str (std :: to_string (i)) {} '? – CoryKramer

+2

Đây là một ví dụ tối thiểu. Tôi muốn quá tải một constructor chấp nhận 7 tham số, 4 trong số đó có giá trị mặc định và tôi muốn tránh đặt rõ ràng các giá trị mặc định ở nhiều nơi. – Makaronodentro

Trả lời

23

C++ 11 giới thiệu 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

Có thể là giá trị của nó' m_str (std :: move (str)) '. – juanchopanza

+0

Có thể đáng lưu ý rằng hàm tạo đích được gọi trước hàm tạo của ủy nhiệm, vì vậy trong phần thân của hàm tạo sau, bạn có thể giả định hàm trước được gọi. –

Các vấn đề liên quan