係数の数値型であるテンプレートPolynom<T>
クラスを作成しています。T
多項式の係数は に格納されますstd::vector<T> coefficients
。ここで、実多項式にcoefficients[i]
対応します。x^i
(したがって、x の累乗は昇順です)。
coefficients
vector には常に少なくとも 1 つの要素が含まれていることが保証されています。- ゼロ多項式の場合はT()
です。
次のことを行うためにオーバーロードしたいoperator[]
:
- operator[] に渡されるインデックスは、係数を変更/読み取りたい X の累乗に対応します。
- ユーザーが係数を読み取る
coefficients.at(i)
だけの場合は、負のインデックスに対してスローし、格納された範囲内のインデックスに対して返さなければなりません。また、スローではなく、他のすべてのインデックスに対して適切に 0 を返す必要があります。 - ユーザーが係数を変更したい場合は、負のインデックスをスローする必要がありますが、指定されたインデックスが より大きいか等しい場合でも、ユーザーは他のすべてのインデックスを自由に変更できます
coefficients.size()
。そのため、何らかの方法でベクトルのサイズを変更したいと考えています。
私が衝突した主な問題は次のとおりです。
1.
読み取りケースと書き込みケースを区別するにはどうすればよいですか? ある人は説明なしで私を残しましたが、2つのバージョンを書いていると言いました:
const T& operator[] (int index) const;
T& operator[] (int index);
不十分でした。ただし、読み取りの場合、コンパイラは const バージョンを好むと思いましたね。
2.
coefficients
末尾のゼロがベクトルに格納されないようにしたいと思います。したがって、係数のミュータブルを返す「前に」、T&
ユーザーが割り当てたい値を事前に知る必要があります。operator[]
そして、それが2番目の引数を受け取らないことを私は知っています。
明らかに、この値がゼロでない (T() ではない) 場合、ベクトルのサイズを変更し、渡された値に適切な係数を設定する必要があります。
T&
ただし、事前に ( from を返す前にoperator[]
) 行うことはできません。割り当てられる値が T() である場合、事前に係数ベクトルのサイズを変更すると、最終的に多くの末尾の「ゼロ」が発生するためです。
もちろん、クラスの他のすべての関数で末尾のゼロをチェックし、その場合は削除できます。私には非常に奇妙な決定のように思えます.サイズ> 1の場合、ベクトルの最後にゼロがないことを前提として、すべての関数が機能し始めることを望みます.
この問題の具体的な解決策を教えてください。T&
オーバーロードされた に暗黙的に変換可能な内部クラスを作成することについて何か聞いたことoperator=
がありますが、詳細が不足しています。
事前にどうもありがとうございました!