問題タブ [noncopyable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
7369 参照

c++ - C ++でコピー可能ではなく移動可能なオブジェクトを作成する

質問です。C++ Boost ライブラリ (特に boost::thread クラス) を見て、「コピーできないが関数から返すことができるオブジェクトを定義するクラスを作成するにはどうすればよいか?」と考えました。

この例をよく考えてみてください。boost::thread クラスには前述の特性があるため、これを行うことができます。

これは、オブジェクト boost::thread をコピーすることはできませんが、関数から返すことは可能であることを意味します。これはどのように可能ですか????

コピーコンストラクターを提供してはいけないと思いますが、関数からの戻りをどのように処理しますか? コピーコンストラクターを使用する必要はありませんか???

ありがとうございました

0 投票する
6 に答える
3444 参照

c++ - 実装提供のコピー コンストラクターと代入演算子

実装 (コンパイラ) がコピー コンストラクターとコピー代入演算子を提供しない状況について、少し混乱しています。

  1. クラスでコピーctorおよび/またはコピー代入演算子を宣言するとき。
  2. プライベートコピーctorおよび/またはコピー代入演算子を持つクラスから派生すると言う人もいます。

私は2番目の状況について少し混乱しています.2番目の状況はまさにそうです.
a) 実装では宣言されないため、コンパイル時にエラーが発生します。
または
b) 実装はそれらを宣言および定義しますが、コンパイラ定義の実装が基本クラスのメソッドを見つけようとすると、コンパイル時エラーが発生します。

私は昨日インタビューを受けました、私はその(b)が起こっていると言いましたが、インタビュアーは同意しません、彼は(a)と言いました。

Microsoft C/C++ 14.00 と gcc 4.4.5 の両方で次のコードをコンパイルしようとしました。

Microsoft コンパイラの出力

gcc コンパイラ出力

したがって、実装はそれを宣言して定義すると思いますが、コンパイラ定義の実装が基本クラスのメソッドを見つけようとすると、コンパイル時エラーが発生します。私が間違っている場合は修正してください。

0 投票する
6 に答える
4622 参照

c++ - boost::noncopyable に継承が必要な理由

コピー不可能なメンバーをクラスに追加すると、コピー構築および代入演算子の自動生成が妨げられます。コピー不可を使用するためにブーストが継承を必要とするのはなぜですか?

文体の好みは私だけではないと思います

とは対照的に

Dave Abrahams は頭の良い人なので、おそらくこの可能性を考慮したでしょう。私は何が欠けていますか?継承は何を達成しますか?

0 投票する
2 に答える
3196 参照

c++ - コピーできないオブジェクトをstd-containersに入れる

このクラスの設計は、コピー割り当てを防ぎ、クライアントコードを偶発的な二重削除から保護するための標準のC ++ 0xの方法dataですか?

ここで新しいmoveメソッドとmove-assignメソッドを定義したことに気づきました。それらを正しく実装しましたか?

移動移動割り当ての定義を使用DataHolderして、標準のコンテナーに入れる方法はありますか?のようにvector?どうすればいいですか?

いくつかのオプションが思い浮かびます。

ここemplace_backでは、アイデアは単なる推測です。

編集:読者の便宜のために、回答をサンプルコードにまとめました。

0 投票する
4 に答える
368 参照

c++ - C++ 場合によってはコピー不可

クラスをコピー不可にすると、コードの品質が大幅に向上することがわかりました。最初はboost::noncopyableでこれを行いましたが、VC++コンパイラエラーはプライベートメンバーほど役に立たないことがわかりました(ダブルクリックするとコード内の間違った場所につながります)。

確かに、クラスが参照として渡されるべき場所に渡されなかったというかなりの数のケースを私に警告しました。そのため、コンストラクトを一度だけコピーする必要があるクラスでも警告を受け取りたいと思っています。

これを行う良い方法はありますか?たとえば、上記の 2 つのメソッドをプライベートのままにして、本当にコンストラクトをコピーしたいときに呼び出すパブリック T(T const&,bool dummy) コンストラクターを追加することを考えていました。または、上記の 2 つのメソッドを公開し、コピーの作成時に何らかの方法でコンパイラの警告をアクティブにして、必要な場所で警告を抑制します。

それとも、もっと良い方法がありますか?

0 投票する
1 に答える
2383 参照

c++ - コピー不可のコンテナをイニシャライザリストで初期化するには?

重複の可能性:
移動専用型のベクトルをリスト初期化できますか?

このコードをコンパイルするには、gcc 4.6.1 を使用します。

g ++が不平を言うには、次のようなものがあります

この場合、g++ はまだコピー コンストラクターを試行しているようですが、イニシャライザー リストに入力したのは右辺値です。では、コピー不可のコンテナをイニシャライザ リストで初期化するにはどうすればよいでしょうか。

0 投票する
4 に答える
908 参照

c++ - Boost noncopyable から派生したクラスから派生したクラスでは、コピーは自動的に禁止されますか?

例えば:

Barコピー不可ですか?

0 投票する
2 に答える
742 参照

c++ - コピー不可を継承しても、dllexportクラスには影響しません

更新以下のバグはVS2012で修正され、期待どおりにnoncopyable機能します

これは質問であり、情報を提供したり他の人に警告したりして、私と同じトラップに陥らないようにする方法でもあります。noncopyable基本クラス(ブーストのクラスなど)を使用しても、エクスポートされたクラスでは効果がないようです。 MSコンパイラ。これはMSにとって既知のバグですが、それを知っているプログラマーがたくさんいるとは思えません。ご想像のとおり、これにより、コンパイルすらしてはならないコードを記述できるため、非常に厄介なバグが発生する可能性があります。例(ここにコピーできないクラスのコード:)

dllプロジェクトの典型的なヘッダーファイル。次のコマンドでコンパイルし/D EXPORT_ITます。

ソースファイル:

アプリケーション:

出力:

1つのコンストラクタ、2つのデストラクタが呼び出されます。クラスにリソースが効果的に含まれている場合の問題を想像してみてください。

コンパイルは行うがすべきではない使用例を編集します。

その他の場合:CantCopyMe MakeIt(){return CantCopyMe(); //致命的なエラーC1001}

質問

  1. KBの記事では、今後のリリースでの修正について言及しています。誰かがこれがVS2010ですでに修正されているかどうかを確認できますか(またはおそらくVisual Studio 11プレビューで)?

  2. 何らかのエラーをトリガーするための回避策はありますか?return CantCopyMe()書き込みが内部コンパイラエラーをトリガーするという事実を(ab)使用してみましたが、MakeIt上記のような関数をコンパイルする場合にのみ条件付きでトリガーする方法を見つけることができませんでした。static_assertをコピー不可能なコピーコンストラクターに入れても、コンパイラーは呼び出されなくても常にコンパイルするため、それはカットされません。

0 投票する
11 に答える
39721 参照

c++ - boost::noncopyable の利点は何ですか

クラスのコピーを防ぐために、プライベート コピー コンストラクター/代入演算子を非常に簡単に宣言できます。ただし、継承することもできますboost::noncopyable

この場合、ブーストを使用することの利点/欠点は何ですか?

0 投票する
6 に答える
27538 参照

c# - c# messagebox.show ポップアップからテキストを選択

私はグーグルとスタックオーバーフローで2時間検索しています。私が単に見落としている何かがなければなりません。メッセージボックスでテキストを選択可能にする簡単な方法はありますか? 現在、MessageBox.Show() を呼び出すと、表示されたテキストをコピーできません。なぜだめですか?テキストをコピーできるように設定するにはどうすればよいですか?

私のコード:

表示されるエラー メッセージを選択できるようにして、ユーザーがそれを送信して問題をトラブルシューティングできるようにしたいと考えています。どんな助けでも大歓迎です。

編集: crtl-c メソッドは使用できません。私のユーザーはその概念を理解できません。マウスで強調表示し、右クリックしてオプションを選択する必要があります。ありがとう!

編集:参考までに、私が最終的に行ったことは、回答の混合物を使用することです。1 つのボタンでポップアップ ウィンドウを作成し、ボタン アクションをクリップボードにコピーしました。完璧ではありませんが、適切なラベルがあれば、今のところ十分に機能します。提案をありがとうございました!