2012-12-04 36 views
17

Trong question này nó đã được thảo luận tại sao phơi bày một loại riêng với auto:Hiển thị loại riêng tư với tính năng tự động: có thể hữu ích ở đâu?

#include <iostream> 

using namespace std; 

class Base { 

    class PrivateClass {  
    public: 
    void bar() { cout << "PrivateClass" << endl; } 
    }; 

public: 

    PrivateClass foo() { 
    PrivateClass a; 
    return a; 
    } 

}; 

int main() { 

    Base b; 
    auto p = b.foo(); 
    p.bar(); 
    return 0; 
} 

là hoàn toàn tốt đẹp theo tiêu chuẩn C++ 11. Những gì tôi vẫn không nhận được là làm thế nào thành ngữ này có thể hữu ích trong một ứng dụng thực tế. Có vấn đề gì khi thành ngữ này có thể được sử dụng hiệu quả hay không hoặc nó nên được xem là tác dụng phụ "tò mò" của từ khóa?

Trả lời

10

Có thể hữu ích nếu loại trả về không được chỉ định. Ví dụ: đối tượng được trả về từ cuộc gọi đến std::bind hoặc trước đây là boost::bind, không được chỉ định. Đó là một số hàm functor được thực hiện, nhưng bạn không thể thực sự biết loại của nó mà không cần nhìn vào các chi tiết triển khai thực hiện. Trước từ khóa auto của C++ 11, bạn có thể sử dụng boost::function làm loại biến để lưu trữ kết quả của bind hoặc bạn có thể chuyển kết quả của bind đến một hàm lấy đối số mẫu. Với C++ 11, bạn có thể lưu trữ đối tượng kết quả bằng cách sử dụng auto.

Vì vậy, nếu một lớp có một số loại nội bộ, không cần thiết phải đưa loại thực tế vào API công khai. Người dùng của lớp có thể chỉ cần sử dụng từ khóa auto và tài liệu API có thể nói loại đó là "không xác định". Điều này giữ cho kiểu nội bộ thực tế là chi tiết triển khai cá nhân, thường có thể cải thiện đóng gói.

+3

Tôi không nghĩ rằng điều này thực sự trả lời câu hỏi. Đó là một câu trả lời hay cho một câu hỏi khác, đó là "việc sử dụng' auto' là gì? " –

+3

Tôi nghĩ nó trả lời câu hỏi. Tên kiểu nội bộ có thể được giữ riêng tư trong khi cho phép máy khách làm việc với các đối tượng thuộc loại đó. –

+4

@Lightness Races trong Orbit, tôi không chắc tại sao bạn nghĩ rằng điều này không trả lời được câu hỏi. Anh ta muốn biết tại sao ai đó sẽ sử dụng 'auto' để lưu trữ một kiểu riêng tư được trả về từ một hàm. Câu trả lời là bởi vì theo cách này, kiểu riêng có thể không được chỉ định trong API công khai. –

1

Wheter từ khóa "tự động" & subclasing cung cấp tính năng như vậy, khái niệm "loại riêng" có vẻ không thực tế.

Trước khi O.O.P., một số nhà phát triển ẩn một số loại bằng cách sử dụng con trỏ (void *), thành "struct". Một trường hợp được cập nhật khác cho phép một đối tượng của một lớp đã cho, chỉ được lớp siêu lớp tiếp xúc.

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