2011-11-28 35 views
9

Thực hành không tốt để khai báo typedef ở phạm vi lớp học? Có tốt hơn để khai báo chúng cho mọi chức năng để đảm bảo không có ai bao gồm tập tin đó và sau đó tạo ra một cái gì đó có cùng tên?Phạm vi lớp typedef thực hành xấu?

Ví dụ

typedef std::vector<int>::size_type vec_int; 

có thể hữu ích trong một số các tiêu đề của tôi như trong một số lớp học có rất nhiều chức năng mà sử dụng loại này, nhưng mặt khác tôi sẽ phải đặt nó trong tiêu đề, wouldn Tôi? Hoặc tôi có thể đặt nó ở đầu tệp nguồn không?

+0

Tôi đoán tôi không hiểu tại sao bạn lại hỏi. Bạn đã nghe điều gì chưa? –

+0

haha, uh, cái gì? Đó có phải là từ một bài hát không? – SirYakalot

+0

Không có typedef trong ví dụ của bạn ... – interjay

Trả lời

13

Tôi muốn nói chỉ giữ phạm vi ở mức tối thiểu; với điều đó, làm bất cứ điều gì là sạch sẽ nhất.

Nếu bạn sử dụng nó cho một hàm, hãy giữ nó trong phạm vi chức năng đó. Nếu bạn sử dụng nó cho một số chức năng, làm cho nó một typedef riêng. Và nếu bạn mong đợi người khác sử dụng nó (ngoài tiện ích, có lẽ), hãy công khai.

Trong mã:

namespace detail 
{ 
    // By convention, you aren't suppose to use things from 
    // this namespace, so this is effectively private to me. 

    typedef int* my_private_type; 
} 

void some_func() 
{ 
    // I am allowed to go inside detail: 
    detail::my_private_type x = 0; 

    /* ... */ 
} 

void some_other_func() 
{ 
    // I only need the typedef for this function, 
    // so I put it at this scope: 
    typedef really::long::type<int>::why_so_long short_type; 

    short_type x; 

    /* ... */ 
} 

typedef int integer_type; // intended for public use, not hidden 

integer_type more_func() 
{ 
    return 5; 
} 

class some_class 
{ 
public: 
    // public, intended for client use 
    typedef std::vector<int> int_vector; 

    int_vector get_vec() const; 

private: 
    // private, only for use in this class 
    typedef int* int_ptr; 
}; 

Hy vọng cung cấp cho bạn một ý tưởng về những gì tôi có ý nghĩa.

+0

thậm chí là hợp pháp để đặt nó ở đầu tệp triển khai theo chỉ thị bao gồm? một thành viên tư nhân là một giải pháp tốt, tôi chỉ tò mò về khả năng. – SirYakalot

+1

@SirYakalot: Vâng, đó chỉ là phạm vi tệp (toàn cầu). Nếu bạn muốn mô phỏng một typedef riêng cho các chức năng miễn phí, thì thường có một không gian tên 'detail' không được cho phép truy cập bởi các máy khách. – GManNickG

+0

những gì bạn sẽ nói là thực hành tốt hơn? một thành viên tư nhân hoặc đặt nó ở đầu nguồn? – SirYakalot

11

Máy đánh chữ phạm vi lớp hoàn toàn ổn và không thể xung đột với bất kỳ thứ gì ngoài phạm vi lớp học.

Các thư viện chuẩn đang hợp tác với typedefs phạm vi lớp (value_type, pointer, reference, iterator, const_iterator vv vv).

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