1

私は疎行列クラスを書いています。コンテンツのテンプレートとなるノード クラスが必要です。このクラスを書く際の問題は次のとおりです。

中身の保管方法は?

内容を値で保存したい。ポインターで保存して破棄する必要がある場合は、問題が発生します。setContents メソッドでコピーを安全に実行するにはどうすればよいですか? C++ は、ノード コンテナーに配置する必要があるクラスがそれ自体を複製できるという保証を提供しますか?

コピーコンストラクターを調べましたが、いくつか問題があります。含まれているクラスがコピー コンストラクターを実装していない場合はどうなるでしょうか。その場合、元のオブジェクトを削除するかスコープ外にする必要がある場合に参照がぶら下がっている可能性があるため、参照によってノードに渡すことは賢明ではありません。

これを行うための「標準C++」の方法は何ですか?

4

3 に答える 3

3

標準的な C++ のアプローチでは、コンテナー クラスで使用される型をコピー可能 (およびおそらく割り当て可能) にする必要があります。これは非常に合理的な要件であり、標準ライブラリのすべてのコンテナ クラス テンプレートで使用されます。

組み込み型と単純な POD 型の場合、通常、ユーザー宣言のコピー コンストラクターは必要ありません。それほど単純ではないが、値セマティクスが必要なクラスの作成者は、通常、いずれにしても適切なコピー コンストラクターを提供する必要がありました。

于 2010-02-03T21:12:02.223 に答える
1

私は疎行列クラスを書いています。コンテンツのテンプレートとなるノード クラスが必要です。

テンプレート実装でノードをコピーすると、ノードがコピー可能であるという要件に単純につながります。パブリック コピー コンストラクターを持たないクラスでテンプレートをインスタンス化しようとすると、コンパイラ エラーが発生します。

テンプレートをインスタンス化するとき、コンパイラは、使用されているすべてのメソッド/... がテンプレートのインスタンス化に使用される型で利用可能であることを確認します。したがって、テンプレートの場合、それを使用するすべてのクラスがパブリック コピー コンストラクターを持つことが保証されます。

パブリック コピー コンストラクターを使用することも合理的な要件です。標準ライブラリのコンテナーでは、要素がコピー可能である必要もあります。また、カスタムの型が定義されていない場合、コンパイラは新しい型のコピー コンストラクターを自動的に生成するため、ほとんどのクラスには使用可能なコピー コンストラクターがあります。

それにもかかわらず、テンプレートのユーザーがそれを認識できるように、テンプレートが通常のセマンティクスでノードのコピーを必要とすることを文書化する必要があります。

于 2010-02-03T21:19:26.137 に答える
0

私の業界では、BOOST ライブラリが非常に人気になっています。 Boost.org

ブーストにはスマートポインターというクラスがあります。基本的には、参照カウントを実装するポインターのラッパー クラスです。誰もポインターを見ていない場合、スマート ポインターはそれ自体を削除します。ダングリング参照、メモリリークなどを含む多くの問題を解決します。

また、別のオプションとして、より優れたコピー コンストラクターを実装することもお勧めします。プログラムにライブラリを追加したくない場合、テンプレートを作成しているクラスがカスタムではなく、デフォルトのコピー コンストラクタ。

于 2010-02-03T21:21:13.997 に答える