2013-02-14 37 views
5
class T 
{}; 

class AccessT 
{ 
public: 
    boost::shared_ptr<const T> getT() const {return m_T;} 
    boost::shared_ptr<T>  getT()  {return m_T;} 

private: 
    boost::shared_ptr<T> m_T; 
}; 

Câu hỏi> Tôi thấy nhiều mã tương tự như trên trong dự án kế thừa. Tôi thực sự không hiểu điểm làm như vậy. Tại sao không chỉ đơn giản là cung cấp sau đây thay vì:Tại sao cung cấp hai chức năng nhận được

class T 
{}; 

class AccessTModified 
{ 
public: 
    boost::shared_ptr<T> getT() const { return m_T; } 

private: 
    boost::shared_ptr<T> m_T; 
}; 

Đối số ban đầu có thể là boost::shared_ptr<const T> getT() const sẽ không cho phép đối tượng const đổi T một cách tình cờ. Nếu đó là trường hợp, nó là một thực tế rằng tất cả các chức năng như vậy nên cung cấp hai phiên bản? Đối với tôi, tôi cảm thấy rất tẻ nhạt!

Trả lời

9

Bạn đúng: mục đích của boost::shared_ptr<const T> getT() const là đảm bảo rằng const đối tượng không thể sửa đổi T một cách tình cờ.

Trong C++, điều này được gọi là const độ chính xác và thường được coi là thiết kế C++ tốt. Như bạn đã nói, nó thường dẫn đến getters có hai phiên bản (const và phiên bản không phải là const). Nó có thể được ban đầu tẻ nhạt (mặc dù nó không phải là xấu một khi bạn đã quen với nó), nhưng kết quả có thể khá hữu ích. đúng đắn const cho phép bạn khai báo các chức năng như

void DoSomething(const AccessT& item); 

hứa hẹn không thay đổi item để trình biên dịch ném một lỗi nếu DoSomething bất cứ điều gì đó là khai báo là có thể sửa đổi item.

Mặc dù tính chính xác của const thường được coi là thiết kế C++ tốt, một số nhà phát triển quyết định rằng việc phải khai báo các phiên bản const và không const của một số hàm sẽ gặp nhiều rắc rối hơn giá trị của nó.

Câu hỏi thường gặp C++ có a whole section về độ chính xác của const, nếu bạn quan tâm đến nhiều thông tin hơn.

1

Mẫu này phổ biến khi cần có lớp cảm ứng, nhưng tác giả không muốn đi toàn bộ cách xác định AccessTAccessTconst để truy cập và truy cập liên tục. Các hack bạn thấy là cách ít tẻ nhạt của việc truy cập liên tục và không liên tục có thể thông qua truy cập liên tục và không liên tục.

Ưu điểm của mẫu này là triển khai dễ dàng, bất lợi là bạn trộn lẫn các khái niệm "con trỏ const" và "con trỏ tới const". Nếu AccessT cung cấp một thành viên setT, sự nhầm lẫn về const-ness sẽ xảy ra.

Bạn có thể tương phản mẫu truy cập này với mẫu const_ được hiển thị, ví dụ: bởi các trình vòng lặp, đến như const_iteratoriterator và cho phép tất cả bốn kết hợp của trình lặp có thể thay đổi và có thể thay đổi được lặp lại.

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