1

RAIIの機能のために、私のオブジェクトはスタック上にのみ配置可能で、オブジェクトの作成は特殊なファクトリに委譲される必要があります。つかいます。C++非ヒープ保護されたコンストラクタとコピーコンストラクタを使用したファクトリオブジェクトの作成

だから私はこのようなことをしました。

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属性を持ち、ヒープ上でこれらのmutexを移動する必要があります。ほとんど利益のために最後に多すぎる問題 – user1079475

関連する問題