1. ホーム
  2. c++

[解決済み】汝、std::vector を継承してはならない。

2022-04-08 12:13:13

質問

さて、告白するのは難しいのですが、現在、私は std::vector .

ベクター用にカスタマイズされたアルゴリズムが10個ほど必要で、それらを直接ベクターのメンバーとして使いたいのです。しかし、当然ながら、私は残りの std::vector のインターフェイスになります。さて、遵法精神に富む私の最初のアイデアは std::vector のメンバーを MyVector クラスがあります。しかし、そうなるとstd::vectorのインターフェイスを全て手動で再提示しなければならなくなります。タイプする量が多すぎる。次に、プライベート継承を考えて、メソッドを再提供する代わりに、たくさんの using std::vector::member をpublicセクションに配置しました。これも実は面倒なんです。

そしてここで私は、本当に単純にパブリックに std::vector しかし、このクラスはポリモーフィックに使ってはいけないという警告をドキュメントに記述しています。ほとんどの開発者は、このクラスがとにかくポリモーフィックに使われるべきではないことを理解するのに十分な能力があると思います。

私の判断は絶対に正当化されないのでしょうか?もしそうなら、なぜですか?次のような代替案を提示できますか? 実際に のメンバーでありながら、vector のインターフェイスをすべて再入力する必要はないのでしょうか?私はそれを疑うが、あなたができる場合、私はちょうど幸せだ。

また、どこかのバカがこんなことを書くのはともかくとして

std::vector<int>* p  = new MyVector

はないでしょうか? 現実的 MyVectorを使用することの危険性?現実的というのは、vectorへのポインタを取る関数を想像してください......というようなことは除外します。

さて、私は自分の主張を述べました。私は罪を犯しました。あとは許すか許さないか、あなた次第です :)

解決方法は?

の公開継承は、実は何の問題もありません。 std::vector . 必要ならそうすればいいだけです。

である場合のみ、そうすることをお勧めします。 本当に 必要です。自由な関数でやりたいことができない場合のみです(例えば、ある状態を維持する必要がある)。

問題なのは MyVector は新しいエンティティです。新しいC++の開発者は、それが一体何であるかを知ってから使うべきだということです。とは何が違うのでしょうか? std::vectorMyVector ? あちこちで使うにはどっちがいい?を移動する必要がある場合はどうすればよいですか? std::vector から MyVector ? を使うだけでいいですか? swap() を使うかどうか?

見栄えをよくするために、新しいエンティティを作らないこと。これらのエンティティは(特に、そのような一般的な)真空中で生きるつもりはありません。常にエントロピーが増大するような環境の中で生きていくことになるのです。