SpecialArray
標準の 2 次元配列と同じ方法でアクセスできるクラスがあります。すなわち、としてA[i][j]
。int
このオブジェクトからの 1 次元配列を抽出する必要があることがよくあります。渡された他のパラメーターに依存する抽出の詳細は重要ではありません。操作のインターフェースの設計に興味があります。
このタスクを達成するための次のアプローチの利点と欠点は何ですか?
オプション1
関数を定義します。
std::vector<int> extract(const SpecialArray &A, ...)
ここ...
で、1 次元配列の内容を決定する他のパラメーターを参照し、次のように使用します。
std::vector<int> output = extract(A,...);
オプション 2
std::vector から継承し、それ自体を構築するクラスを作成します。
class SpecialArrayExtract : public std::vector<int> {
public:
SpecialArrayExtract(const SpecialArray &A, ...);
};
ここで、コンストラクター (または同等のinit
関数) は...
入力を使用*this
して適切なデータを入力し、次のように使用します。
SpecialArrayExtract output(A,...);
オプション 3
オプション 2 とまったく同じように進めますが、継承せずstd::vector<int>
、代わりに必要に応じて公開されたインターフェイスを持つprivate
メンバーを持ちます。std::vector<int>
class SpecialArrayExtract {
private:
std::vector<int> m_data;
public:
SpecialArrayExtract(const SpecialArray &A, ...);
[Wrapper functions for std::vector<int> here.]
};
解説
アプリケーションは高性能ですが、オプション 1 の RVO では、これらはすべて同等に機能するはずだと思います。
これをタイトルに結び付けると、私が理解しようとしているポイントは、オプション 2 と 3 の両方が、本質的にstd::vector<int>
別の名前と特別なコンストラクターを持つクラスを定義するということです。いつ、もしも!-- これは合理的な考えですか? また、どちらがより良い方法ですか?