2012-10-16 8 views
5

Mögliche Duplizieren: eine Factory-Methode, die zurückgibt
How do I call ::std::make_shared on a class with only protected or private constructors?mit std :: shared_ptr mit einem geschützten Konstruktor destructor

Ich möchte einen gemeinsamen Zeiger auf eine Klasse erstellen, und haben Es bleibt dabei der Konstruktor \ destructor geschützt. Da der gemeinsame Zeiger nicht auf den Konstruktor oder den Destruktor zugreifen kann, erhalte ich Compilerfehler.

Ich benutze llvm 4.1, aber ich bin auf der Suche nach einer Lösung, die Compiler unabhängig sein kann (abgesehen davon, dass der Konstruktor \ destructor public).

dies ist ein Codebeispiel:

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

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

}; 

irgendwelche Ideen?

+0

Und 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/cani-i-use-boostmake-shared-with-a-private-constructor etc. – interjay

+0

Und http://stackoverflow.com/questions/8202530/how -can-i-call-a-private-destructor-from-a-shared-ptr für das Destruktor-Problem – interjay

Antwort

2

vergeben Sie einfach den Zeiger selbst statt make_shared Berufung:

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

Beachten Sie jedoch, dass dies die destructor öffentlich zu machen erfordern würde.

+1

Dies kann den Konstruktorfehler, aber nicht den Destruktor lösen. es hat auch Leistungsprobleme, da es eine zusätzliche Speicherzuweisung durchführen wird – danny

+1

Es gibt gute Gründe, 'make_shared' zu verwenden, einschließlich weniger Heapzuweisungen und besserer Referenzlokalität. –

+0

@danny bitte beschreiben Sie die zusätzliche Speicherbelegung. – syplex

Verwandte Themen