2010-05-20 32 views
5

Tôi đang cố gắng để thực hiện phương pháp chaining trong C++, mà hóa ra là khá dễ dàng nếu cuộc gọi constructor của một lớp là một tuyên bố riêng biệt, ví dụ:phương pháp chaining bao gồm constructor lớp

Foo foo; 

foo.bar().baz(); 

Nhưng ngay khi hàm gọi hàm tạo trở thành một phần của chuỗi phương thức, trình biên dịch phàn nàn về việc mong đợi ";" thay cho "." ngay lập tức sau khi gọi hàm tạo:

Foo foo().bar().baz(); 

Tôi tự hỏi bây giờ nếu điều này thực sự có thể trong C++. Đây là lớp học thử nghiệm của tôi:

class Foo 
{ 
public: 
    Foo() 
    { 
    } 

    Foo& bar() 
    { 
     return *this; 
    } 

    Foo& baz() 
    { 
     return *this; 
    } 
}; 

Tôi cũng tìm thấy một ví dụ cho "giao diện thông thạo" trong C++ (http://en.wikipedia.org/wiki/Fluent_interface#C.2B.2B) mà có vẻ là chính xác những gì tôi đang tìm kiếm. Tuy nhiên, tôi nhận được lỗi trình biên dịch tương tự cho mã đó.

+1

Trình biên dịch này là gì? –

+0

Ồ, tôi quên đề cập đến điều này: Visual Studio 2010 (Professional). – jena

+0

Foo foo = bar(). Baz(). Bang(); –

Trả lời

8

Bạn đã quên tên thực tế cho đối tượng Foo. Hãy thử:

Foo foo = Foo().bar().baz(); 
+5

Hoặc bạn có thể lưu tham chiếu (const) vào đối tượng thay vì sao chép tạm thời vào một biến mới. –

+0

@LokiAstari: không may là không, vì baz trả về một tham chiếu đến tạm thời, không phải là tạm thời. (Tự mình mắc sai lầm) – peterchen

11

Hãy thử

// creates a temporary object 
// calls bar then baz. 
Foo().bar().baz(); 
+0

mặc dù trong trường hợp này, trả lại một tham chiếu đến một đối tượng tạm thời là một chút dodgy ;-) – stefaanv

+5

Không có nó cũng được xác định ở đây. Khi đối tượng tạm thời vẫn còn hiệu lực cho đến khi kết thúc câu lệnh (';'). Tất cả là giá vé trong tình yêu và thời gian. –

1

Không, cú pháp cho khai báo biến C++ không cho phép điều đó - hoặc là một tên biến với một danh sách đối số tùy chọn, hoặc một nhà điều hành phân công và một biểu thức.

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