2008-10-15 47 views
5

Một trong các lớp trong chương trình của tôi sử dụng một số thư viện của bên thứ ba. Đối tượng thư viện là thành viên riêng tư của lớp học của tôi:Tiêu đề C++ - tách biệt giữa chi tiết giao diện và chi tiết triển khai

// My.h 
    #include <3pheader.h> 

    class My 
    { 
    ... 
    private: 
     3pObject m_object; 
    } 

Vấn đề với điều này - bất kỳ đơn vị nào khác trong chương trình của tôi sử dụng lớp học của tôi phải được cấu hình bao gồm tiêu đề 3p. Di chuyển đến một loại 3p sẽ gây nguy hiểm cho toàn bộ xây dựng ... Tôi thấy hai cách để sửa lỗi này - một là để làm cho 3pObject extern và biến m_Object thành một con trỏ, được khởi tạo trong hàm tạo; thứ hai là tạo các lớp "giao diện" và "nhà máy" và xuất chúng ...

Bạn có thể đề xuất một cách khác để giải quyết điều đó không?

Trả lời

11

Sử dụng "pimpl" thành ngữ:

// header 
class My 
{ 
    class impl; 
    std::auto_ptr<impl> _impl; 
}; 

// cpp 
#include <3pheader.h> 
class My::impl 
{ 
    3pObject _object; 
}; 
+0

Bất kỳ lý do nào không sử dụng boost :: scoped_ptr? – grigy

+0

Không có gì cụ thể - Tôi đã quen với việc sử dụng auto_ptr - nó có lẽ phù hợp hơn trong trường hợp này để sử dụng scoped_ptr vì không có chuyển quyền sở hữu –

13

Các Thực hiện tư nhân (pImpl) mẫu:

http://www.codeproject.com/KB/tips/PIMPL.aspx

Về cơ bản, bạn xác định rằng lớp học của bạn giữ một con trỏ đến một cấu trúc mà bạn mong tuyên bố. Sau đó, bạn định nghĩa cấu trúc bên trong tệp cpp và sử dụng hàm tạo và hàm hủy trong lớp của bạn để tạo/xóa PIMPL.

:)

0

Tất cả các cấu trúc bên trong của QT được thực hiện sử dụng các lớp thực hiện tư nhân.
Bạn có thể tra cứu nó để có tham khảo tốt về cách thực hiện chính xác.

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