2013-01-06 33 views
5

Tôi có lớp nàyC++ constructor cuộc gọi khác constructor dựa trên tham số kiểu

class XXX { 
    public: 
     XXX(struct yyy); 
     XXX(std::string); 
    private: 
     struct xxx data; 
}; 

Các nhà xây dựng đầu tiên (người làm việc với một cấu trúc) rất dễ dàng để thực hiện. Thứ hai tôi có thể chia một chuỗi trong một định dạng cụ thể, phân tích cú pháp và tôi có thể trích xuất cùng một cấu trúc.

Câu hỏi của tôi là, trong java tôi có thể làm một cái gì đó như thế này:

XXX::XXX(std::string str) { 

    struct yyy data; 
    // do stuff with string and extract data 
    this(data); 
} 

Sử dụng this(params) để gọi constructor khác. Trong trường hợp này tôi có thể có cái gì đó tương tự?

Cảm ơn

Trả lời

2

Có. Trong C++ 11, bạn có thể làm điều đó. Nó được gọi là constructor delegation.

struct A 
{ 
    A(int a) { /* code */ } 

    A() : A(100) //delegate to the other constructor 
    { 
    } 
}; 
+0

Bạn có biết trình biên dịch nào hiện đang thực hiện thay đổi này hay không, dường như tôi nhớ lại rằng Clang chưa (ví dụ). –

+0

@MatthieuM: Tôi không biết. Đã không thử nghiệm nó với bất kỳ trình biên dịch. :-) – Nawaz

+0

:) Tôi e rằng điều này không được coi là quan trọng trong thực tế bởi vì ủy quyền cho một phương thức riêng tư hoạt động rất tốt (miễn là tất cả các thuộc tính hỗ trợ phân công), và do đó là ưu tiên thấp cho mọi người. –

8

Thuật ngữ mà bạn đang tìm kiếm là "constructor delegation" (hoặc tổng quát hơn, "constructors xích"). Trước C++ 11, chúng không tồn tại trong C++. Nhưng cú pháp cũng giống như việc gọi một hàm tạo lớp cơ sở:

class Foo { 
public: 
    Foo(int x) : Foo() { 
     /* Specific construction goes here */ 
    } 
    Foo(string x) : Foo() { 
     /* Specific construction goes here */ 
    } 
private: 
    Foo() { /* Common construction goes here */ } 
}; 

Nếu bạn không sử dụng C++ 11, điều tốt nhất bạn có thể làm là định nghĩa một hàm trợ giúp riêng để xử lý mọi thứ chung cho tất cả các nhà xây dựng (mặc dù điều này gây phiền toái cho những thứ bạn muốn đưa vào danh sách khởi tạo). Ví dụ:

class Foo { 
public: 
    Foo(int x) { 
     /* Specific construction goes here */ 
     ctor_helper(); 
    } 
    Foo(string x) { 
     /* Specific construction goes here */ 
     ctor_helper(); 
    } 
private: 
    void ctor_helper() { /* Common "construction" goes here */ } 
}; 
+0

Tôi đang upvoting câu trả lời của bạn bởi vì nó hoàn chỉnh hơn. Nhưng các ví dụ sẽ rất hay. :-) – Omnifarious

+2

@Omnifarious: Các ví dụ đã tồn tại! –