Из-за возможностей RAII я хочу, чтобы мои объекты могли быть размещены только в стеке, а также, поскольку создание объектов должно быть делегировано специализированным фабрикам, я не хочу, чтобы конструктор ocpy был доступен для использовать.C++ non heap Создание объекта Factory с защищенным конструктором и конструктором копирования
Так что я сделал что-то вроде этого.
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
}
я могу сделать что-то вроде этого
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();
}
Но это не кажется, выглядит правильно.
Каковы другие способы борьбы с этим?
В конце концов я отправился на unique_ptr. Существовало много проблем, возникающих, когда dtors, где участвует в каждой операции перемещения. – user1079475
@ user1079475 вы знаете прецедент лучше, чем я. Но я думал, что тебе нужны объекты в стеке? –
Да, я сделал, но было слишком много суеты с движущимися объектами из области метода в область обращения. Эти объекты имеют атрибуты mutex, и для этого потребуется переместить эти мьютексы на кучу и так далее. Слишком много неприятностей, в конце концов, для небольшого выигрыша – user1079475