2016-09-07 4 views
0

私は、実行時にインスタンスのコピーが似ていてはならないという要件のクラスをいくつか持っています。クラスの一つのように見えるとしましょう - どの2つのインスタンスが一度に同じプリンタを制御することはできませんので、コピーコンストラクタ/割り当てブレークの標準ライブラリ操作を削除する

class A{ 
    int id; 
    int printerNum; 

    bool failState = true; 
    //.... 

public: 
    //.... 

}; 

idprinterNumは、各インスタンスに固有でなければなりません。 idはオブジェクトの作成時にのみ生成されますが、printerNumは変更できます。この2つの要件については、コンストラクタとオブジェクトを正しく初期化することがない変数failStateのチェックを行い、何か問題が発生した場合はfailStateをtrueに設定します。

また、コピーコンストラクタと代入演算子を削除して、ユーザーがコピーを作成せず、idとprinterNumが一意になるようにコンストラクタから初期化できることを確認しました。

しかし、この変更を行う前に、標準の名前空間内で他のアルゴリズムやコンテナを利用できないかと尋ねることを考えていましたか?彼らは多くの場合、代入演算子とコピーコンストラクタを使用している可能性があり、私は次のように明示的にこれらを削除した場合、何が起こるか - ことができない場合は

// no copy 
A(const A&) = delete; 

// no assign 
A& operator=(const A&) = delete; 

、または、私はすべての提案を歓迎するこれを行うための別の方法があります。ありがとうございます:)

+1

もしそうなら、それはコンパイルされません。 – Tobias

+0

あなたはまだあなたのクラスのプライベートとしてコピーコンストラクタ&代入演算子を定義することができます。 –

+0

@ Jean-FrançoisFabreどのような利点がありますか?それはまだアクセスできないでしょう、そうですか? –

答えて

4

C++ 11では、コンテナで使用されるタイプの要件は、呼び出した操作によって異なります。 無条件で唯一必要なものは、タイプがErasableであり、標準アロケータで使用する場合は、p->~T()を整形式にして有効にする必要があります。

したがって、ベクトルを再割り当てするか、コピーコンストラクションバージョンの挿入を使用する場合は、copy-constructionが必要です。たとえば、要素がベクトルの中央に挿入されたり、コンテナがソートされたりする場合には、代入が必要です。

要素に課される要件は容器上に実行される実際 操作に依存:

例えば、ここでvectorhttp://en.cppreference.com/w/cpp/container/vectorからの引用です。一般に、 要素型は完全型であり、要求事項を満たす必要があります。 消去可能ですが、多くのメンバ関数はより厳しい要件を課しています。

+0

copy-constructionまたはそれ以降の操作では、完了した後で2つのオブジェクトが同時に存在しないことが保証されていますか?終了時にコピーまたはオリジナルのいずれかを削除する必要がありますか? –

+0

@hg_git、私は質問を理解するかどうか分からない。少し明確にしていただけますか? – SergeyA

+0

私は3つのオブジェクトを持つ 'ベクトル 'を持っていて、メンバ' int a'' = '' 1,2、および3'を持っているとします。再割り当て中に、コピーコンストラクタ呼び出しがメンバーa = 1であるsayオブジェクトのコピーを作成する時間が存在しなければなりません。その時、2つの同一のオブジェクトが存在します。メンバ 'a'の値を考慮することにより、一意性が決まります。 –

関連する問題