2010-06-20 37 views
10

Điều này có khả thi không?Khởi tạo và trả về một cấu trúc trong một dòng trong C++

Tôi biết rằng bạn có thể khởi tạo cấu trúc bằng cách sử dụng cú pháp danh sách.

IE

struct Foo f = { a, b, c}; 
return f; 

là một khả năng để làm điều này trong một dòng như bạn có thể với các lớp học và nhà thầu?

Cảm ơn

+1

Nếu một số câu trả lời giúp bạn, vui lòng chấp nhận câu trả lời đó. Nếu không, hãy cho chúng tôi biết nếu bạn có thêm câu hỏi. –

Trả lời

14

Tạo một constructor cho struct (giống như một lớp học) và chỉ làm

return Foo(a,b,c); 

Sửa: chỉ cần làm rõ: struct trong C++ cũng giống như các lớp học với sự khác biệt nhỏ quyền truy cập mặc định của họ là công khai (và không phải là riêng tư như trong một lớp). Vì vậy, bạn có thể tạo một constructor rất đơn giản, như:

struct Foo { 
    int a; 
    Foo(int value) : a(value) {} 
}; 
21

Nếu bạn muốn struct của bạn vẫn là một POD, sử dụng một chức năng mà tạo ra nó:

Foo make_foo(int a, int b, int c) { 
    Foo f = { a, b, c }; 
    return f; 
} 

Foo test() { 
    return make_foo(1, 2, 3); 
} 

Với C++ 0x uniform initialization loại bỏ cần cho chức năng đó:

Foo test() { 
    return Foo{1, 2, 3}; 
    // or just: 
    return {1, 2, 3}; 
} 
+6

Trong C++ 0x, bạn thậm chí có thể 'return {1,2,3}; ' – Cubbi

+2

@Cubbi: Đúng, điểm tốt - mặc dù tôi nghĩ tôi thích phiên bản rõ ràng hơn để tránh những cạm bẫy bảo trì khi chúng ta bắt đầu sử dụng các tính năng mới trong sản xuất. –

+2

Tôi nghĩ rằng sau này có thể khá thuận tiện nếu kiểu trả về là phức tạp: 'tuple test() {return/* tuple */{x, y, z};}'. (Tôi đoán đôi khi kiểu kết quả thậm chí có thể phức tạp về tâm trí, thậm chí có thể xác định với sự giúp đỡ của 'decltype' và như vậy, trong trường hợp đó có thể tốt đẹp không phải lặp lại khoản khấu trừ :)) – UncleBens

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