両端キューに push_back したいクラスがあります。問題は、プッシュバックするときに元のオブジェクトを変更する必要があるため、非 const コピー ctor が必要なことです。これを実装すると、const コピー ctor が呼び出されます。const ctor を削除すると、使用可能な ctor がないというコンパイル エラーが発生します。渡すときに元の構造体を変更できるようにこれを実装するにはどうすればよいですか? 私はそれを変更する必要があります.bcはスコープ外になるとオブジェクトを破壊します.別のインスタンスがある場合はそうしないように指示したいと思います. プラットフォームがサポートしていないため、ブーストを使用できません。
4 に答える
あなたの問題は、標準コンテナの基本的な要件は、オブジェクトがコピー構築可能であることです。これは、コピー コンストラクターがあることを意味するだけでなく、オブジェクトをコピーすると、コピーとオリジナルが同じであることも意味します。
ただし、オブジェクトは移動コンストラクターのセマンティックに似ています。つまり、移動後、新しいオブジェクトがリソースを所有し、古いオブジェクトは空になります。これは、C++03 の deque ではサポートされていません。ちなみに、auto_ptr をコンテナーに入れることを禁止するのと同じ理由です。
c++0x と呼ばれる次の C++ バージョンは、特別な移動コンストラクターを導入することで、これらの移動セマンティクスをサポートします。それまでは、標準のコンテナーに入れたい場合は、所有権を共有するオブジェクトを使用する必要があります。つまり、オブジェクトをコピーして元のオブジェクトが範囲外になった場合、すべてのコピーが範囲外になるまで、所有されているリソースは解放されません。たとえば、boost::shared_ptr の使用を検討するか、それを管理する独自のクラスをプログラムしたくない場合は、それをクラスにラップします。
リソースで危険なことをしていない場合(他のコメントを参照)、変更したいメンバー変数を変更可能にすると、const関数で変更できるようになります。
何をしようとしているかに応じて(詳細があればいいでしょう)、呼び出す前/後にオブジェクトを変更するか、push_back
クラスへのポインタを取り、に挿入できる単純なラッパークラスを作成できますdeque
。このオブジェクトは、構築/破壊などでクラスに適切なことを行うことができます。
やろうとしていることはできません。プレーンまたはスマートのポインターを使用する必要があります (ただし、auto_ptr<> は使用しないでください)。Boost スマート ポインターを使用できないのはなぜですか? それらは非常に軽量で、合理的に標準的なすべての C++ コンパイラで動作するはずです。すべての Boost を使用する必要はありません。