2012-10-16 21 views
5

Powiel możliwe:
How do I call ::std::make_shared on a class with only protected or private constructors?użyciu std :: shared_ptr z chronioną konstruktora destructor

Chcę utworzyć wspólny wskaźnik do klasy i mają metody fabryki, która zwraca to przy zachowaniu chronionego konstruktora \ destruktora. ponieważ współdzielony wskaźnik nie może uzyskać dostępu do konstruktora lub destruktora, otrzymuję błędy kompilatora.

Używam llvm 4.1, ale szukam rozwiązania, które może być niezależne od kompilatora (poza tym, że konstruktor \ destruktor jest publiczny).

to przykładowy kod:

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

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

}; 

jakieś pomysły?

+0

I http://stackoverflow.com/questions/3541632/using-make-shared---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 itp. – interjay

+0

i http://stackoverflow.com/questions/8202530/how -can-i-call-a-private-destructor-from-a-shared-ptr dla problemu destruktora – interjay

Odpowiedz

2

Wystarczy przeznaczyć wskaźnik sam zamiast dzwonić make_shared:

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

jednak pamiętać, że będzie to wymagać dokonywania publicznej destructor.

+1

może to rozwiązać błąd konstruktora, ale nie destruktora. również ma problemy z wydajnością, ponieważ będzie wykonywać dodatkową alokację pamięci. – danny

+1

Istnieją dobre powody, aby używać 'make_shared', w tym mniej alokacji sterty i lepszą lokalizację odniesienia. –

+0

@danny proszę opisać dodatkowy przydział pamięci. – syplex

Powiązane problemy