2013-03-22 31 views
5

Tôi muốn giảm thiểu việc sử dụng #include trong các tệp tiêu đề của tôi, sử dụng các khai báo chuyển tiếp bất cứ khi nào có thể và tôi tin rằng đây được coi là thực hành tốt.Các con trỏ thông minh có phá vỡ nguyên tắc giảm thiểu #includes trong các tệp tiêu đề không?

Nó hoạt động tuyệt vời nếu tôi có một phương pháp kê khai như:

bool IsFlagSet(MyObject *pObj); 

Tuy nhiên nếu tôi có typedef Ptr<MyObject> MyObjectPtr trong MyObject.h và những thay đổi API để:

bool IsFlagSet(MyObjectPtr pObj); 

Tôi không phải bây giờ để #include "MyObject.h"? Có cách nào xung quanh điều này, hoặc là nó chỉ là giá một trả tiền cho việc sử dụng con trỏ thông minh?

+0

Tại sao không 'bool IsFlagSet (Ptr pObj); '? –

+0

Nếu bạn vượt qua con trỏ thông minh bằng cách tham chiếu, nó sẽ không hoạt động như trước? –

+2

P.S. Trừ khi chức năng đang thay đổi quyền sở hữu của con trỏ thông minh, không cần sử dụng con trỏ thông minh trong giao diện. Sử dụng một cái câm thay vào đó và sử dụng 'get' của con trỏ thông minh tại trang gọi. –

Trả lời

9

Không, bạn không phải làm như vậy. Bạn có thể định nghĩa một kiểu bí danh cho một lớp học đầy đủ, và đối số mẫu có thể không đầy đủ các loại (xem Đoạn 14.3.1/2 của Tiêu chuẩn C++ 11):

#include <memory> 

struct C; 

typedef std::shared_ptr<C> ptrC; // C is incomplete here 

struct C { void foo() { } }; 

int main() 
{ 
    ptrC p = std::make_shared<C>(); 
    p->foo(); 
} 

Như đã đề cập một cách chính xác bởi Pubby trong các ý kiến , tờ khai chức năng không đòi hỏi các loại nêu tại chữ ký của họ sẽ hoàn thành một trong hai:

struct C; 

void foo(C); // C is incomplete here 

struct C { }; 

#include <iostream> 

void foo(C) 
{ 
    std::cout << "foo(C)" << std::endl; 
} 

int main() 
{ 
    C c; 
    foo(c); 
} 
+0

Bạn có thể muốn thêm các khai báo hàm đó không cần kiểu đầy đủ. – Pubby

+0

@Pubby: Cảm ơn bạn đã thêm câu trả lời –

+0

Thú vị, cảm ơn. –

3

không, std::shared_ptr<T> được thiết kế một cách rõ ràng để làm việc khi T là chỉ chuyển tiếp-tuyên bố. Tất nhiên, điều này không làm việc cho tất cả các trường hợp, nhưng nguyên tắc là giống như đối với một con trỏ đơn giản. Nếu T được chuyển tiếp tuyên bố, bạn có thể làm bất cứ điều gì với std::shared_ptr<T> mà bạn có thể làm với T*.

0

bạn có thể sử dụng typedef với loại không đầy đủ.

Nhưng không nên sử dụng tên đầy đủ của loại con trỏ thông minh?

MyClassPtr đương nhiên ngắn hơn nhiều, nhưng std::unique_ptr<MyClass> thực sự cho chúng tôi biết cách sử dụng con trỏ này. Vì vậy, không phải tên rất dài tôi đề nghị sử dụng tên đầy đủ của con trỏ thông minh.

+0

Không giúp đỡ nếu ai đó đã viết mã. Mẫu này 'typedef Ptr TypePtr' là một trong những thư viện tôi thấy trong một số thư viện cả nguồn mở và độc quyền. –

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