2012-11-27 40 views
11

Tôi có một cặp các nhà xây dựng hoạt động tốt trong kiểu C++ 03. Một trong những nhà xây dựng gọi một constructor lớp cha (hoặc lớp cơ sở) ...Ủy nhiệm các nhà xây dựng: một bộ khởi tạo cho một nhà xây dựng ủy nhiệm phải xuất hiện một mình

class Window : public Rectangle 
{ 
public: 
    Window() : win(new RawWindow(*this)) 
    { 
     refresh(); 
    } 

    Window(Rectangle _rect) : Rectangle(_rect), win(new RawWindow(*this)) 
    { 
     refresh(); 
    } 
... 

Tôi cố gắng để tìm ra cách để sử dụng chức năng C++ 11 Delegating ctor mới để neaten này lên một chút. Tuy nhiên, đoạn mã sau cung cấp cho các lỗi biên dịch sau đây ...

class Window : public Rectangle 
{ 
public: 
    Window() : win(new RawWindow(*this)) 
    { 
     refresh(); 
    } 

    Window(Rectangle _rect) : Rectangle(_rect), Window(){} 

"một initializer cho một constructor ủy thác phải xuất hiện một mình" ...

Có cách nào để khắc phục điều này ??

Trả lời

9

Vấn đề là Rectangle sẽ được khởi tạo hai lần.

Bạn có thể thử thay đổi mà một đại biểu những gì:

Window(Rectangle _rect) : Rectangle(_rect), win(new RawWindow(*this)) 
{ 
    refresh(); 
} 

Window() : Window(Rectangle()) {} 

Giải pháp tốt nhất có lẽ là để tránh ủy thác xây dựng trong ví dụ này.

+0

"tránh các nhà thầu ủy nhiệm trong ví dụ này" - Thấy mã của bạn hoạt động (nhờ +1), bạn có thể mở rộng về lý do bạn đưa ra đề xuất này không? – learnvst

+0

@learnvst Chúng hoạt động như một đối số mặc định ưa thích. Tôi tìm các đối số mặc định hoặc mã ban đầu của bạn để dễ đọc hơn. – Pubby

+0

Vâng, điều 'Window (Rectangle())' trông hơi lạ. Tôi biết bạn đến từ đâu. – learnvst

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