2012-10-16 43 views
5

thể trùng lặp:
How do I call ::std::make_shared on a class with only protected or private constructors?using std :: shared_ptr với một constructor destructor bảo vệ

Tôi muốn tạo ra một con trỏ chia sẻ cho một lớp học, và có một phương pháp nhà máy trả về nó trong khi vẫn giữ bảo vệ constructor \ destructor. kể từ khi con trỏ được chia sẻ không thể truy cập vào constructor hoặc destructor, tôi nhận được các lỗi trình biên dịch.

Tôi đang sử dụng llvm 4.1, nhưng tôi đang tìm một giải pháp có thể là trình biên dịch độc lập (bên cạnh việc tạo công cụ \ constructor \ destructor).

đây là một mẫu mã:

class Foo 
{ 
public: 
    static std::shared_ptr<Foo> getSharedPointer() 
    { 
     return std::make_shared<Foo>(); 
    } 

protected: 
    Foo(int x){} 
    ~Foo(){} 

}; 

bất kỳ ý tưởng?

+0

Và http://stackoverflow.com/questions/3541632/using-make-shared-with-a-protected-constructor-abstract-interface http://stackoverflow.com/questions/7521660/friend-function-of -stdmake-shared http://stackoverflow.com/questions/2590310/can-i-use-boostmake-shared-with-a-private-constructor, v.v. – interjay

+0

Và http://stackoverflow.com/questions/8202530/how -can-i-call-a-private-destructor-from-a-shared-ptr cho vấn đề destructor – interjay

Trả lời

2

Chỉ cần bố trí con trỏ chính mình thay vì gọi make_shared:

static std::shared_ptr<Foo> getSharedPointer() 
{ 
    return std::shared_ptr<Foo>(new Foo); 
} 

Lưu ý, tuy nhiên, điều này sẽ đòi hỏi khiến công chúng destructor.

+1

điều này có thể giải quyết lỗi của hàm tạo, chứ không phải là hàm hủy. cũng có vấn đề về hiệu suất vì nó sẽ thực hiện phân bổ bộ nhớ bổ sung – danny

+1

Có nhiều lý do để sử dụng 'make_shared' bao gồm phân bổ heap ít hơn và địa phương tham chiếu tốt hơn. –

+0

@danny vui lòng mô tả phân bổ bộ nhớ bổ sung. – syplex

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