1

Из-за возможностей 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(); 
} 

Но это не кажется, выглядит правильно.

Каковы другие способы борьбы с этим?

ответ

1

Как я могу это сделать, это удалить копии, включить ходы и разрешить строительство через любой класс, который может создать ключ строительства.

// forward declare any factories 
class Spawner; 

struct ProtectedClass 
{ 
    class PermissionKey { 
     // this is a private constructor 
     PermissionKey() {}; 

     // make friends of the factories 
     friend Spawner; 
    }; 

    // all this is now public. 
    // because we have declared a constructor, the default constructor 
    // is deleted.  
    ProtectedClass(PermissionKey) {} 

    // disable copies 
    ProtectedClass(const ProtectedClass& aThat)=delete; 
    ProtectedClass& operator=(const ProtectedClass& aThat)=delete; 

    // enable moves so the factory can return it 
    ProtectedClass(ProtectedClass&& aThat)=default; 
    ProtectedClass& operator=(ProtectedClass&& aThat)=default; 
}; 

class Spawner 
{ 
public: 
    ProtectedClass getProtectedClass() 
    { 
     // construct our spawned object - we can create keys 
     return ProtectedClass(ProtectedClass::PermissionKey()); 
    } 
}; 

int main() 
{ 
    Spawner spawner; 
    //I need protectedClass to be enclosed within this frame 
    auto protectedClass = spawner.getProtectedClass(); // ok now 
} 
+0

В конце концов я отправился на unique_ptr. Существовало много проблем, возникающих, когда dtors, где участвует в каждой операции перемещения. – user1079475

+0

@ user1079475 вы знаете прецедент лучше, чем я. Но я думал, что тебе нужны объекты в стеке? –

+0

Да, я сделал, но было слишком много суеты с движущимися объектами из области метода в область обращения. Эти объекты имеют атрибуты mutex, и для этого потребуется переместить эти мьютексы на кучу и так далее. Слишком много неприятностей, в конце концов, для небольшого выигрыша – user1079475

 Смежные вопросы

  • Нет связанных вопросов^_^