Wegen der RAII-Funktionen möchte ich meine Objekte nur auf dem Stapel platzierbar sein und auch als Objekt Erstellung an spezialisierte Fabriken delegiert werden möchte ich nicht ocpy Konstruktor zugänglich sein benutzen.C++ nicht Heap Factory-Objekt Erstellung mit geschützten Konstruktor und Kopie Konstruktor
Also habe ich so etwas getan.
template<typename Product, Args ... >
class Creator : public Product
{
public:
static Product create(Args ... args)
{
return Product(args ...);
}
};
class ProtectedClass
{
ProtectedClass(const ProtectedClass& aThat)=delete;
ProtectedClass& operator=(const ProtectedClass& aThat)=delete;
protected:
ProtectedClass(){}
};
class Spawner
{
public:
ProtectedClass getProtectedClass()
{
return Creator<ProtectedClass>::create();
}
}
int main()
{
Spawner spawner;
//I need protectedClass to be enclosed within this frame
ProtectedClass protectedClass = spawner.getProtectedClass(); // err copy constructor is delted
}
Ich kann
template<typename Product, Args ... >
class Creator : public Product
{
public:
Creator(Args ... args) : product_(args ...){}
Product& get() const
{
return product_;
}
private:
Product product_;
};
class Spawner
{
public:
std::unique_ptr<Creator<ProtectedClass>> getProtectedClassCreator()
{
return new Creator<ProtectedClass>();
}
}
int main()
{
Spawner spawner;
std::unique_ptr<Creator<ProtectedClass>> creator = std::move(spawner.getProtectedClassCreator());
ProtectedClass& protectedClass = creator->get();
}
wie diese etwas tun, aber es scheint nicht richtig zu sehen.
Was sind andere Möglichkeiten, damit umzugehen?
Am Ende ging ich für unique_ptr. Es gab viele Probleme, die auftraten, wenn die Dktoren bei jeder Bewegung beteiligt waren. – user1079475
@ user1079475 Sie kennen den Anwendungsfall besser als ich. Aber ich dachte, du wolltest die Objekte auf dem Stapel? –
Ja, ich tat, aber es gab zu viel Hektik mit beweglichen Objekten vom Methodenbereich zum Aufrufbereich. Diese Objekte hatten Mutex-Attribute und es würde erforderlich sein, diese Mutexe auf dem Heap zu verschieben, und so weiter. Zu viel Mühe am Ende für wenig Gewinn – user1079475