を言うことができる何であるかの設定値を管理することができますBigNumの要素の参照。 BigNumのoperator=
はラッパーを値で返します。
a[i]=11;
は、NumWrapper x(...); x = 11
のようなものです。今すぐoperator=
のチェックをNumWrapper
にすることができます。 NumWrapperで
class BigNum {
public:
NumWrapper operator[](size_t index) {
return NumWrapper(array_[index]);
}
int operator[](size_t index) const {
return array_[index];
}
};
、など、いくつかの演算子をオーバーロード:ユーザーを防止するために、あなたはまた、NumWrapperのコピーを宣言し、プライベートとしてコンストラクタを移動し、彼の友人をBIGNUM行うことができます
class NumWrapper {
public:
NumWrapper(int &x) : ref_(x) {}
NumWrapper(const NumWrapper &other) : ref_(other.ref_) {}
NumWrapper &operator=(const NumWrapper &other);
int operator=(int x);
operator int();
private:
int &ref_;
};
あなたのラッパーをコピーすることからのコード。そのようなコードauto x = a[i]
はコンパイルしませんが、ユーザコードはラップされた値をauto x = static_cast<T>(a[i])
(冗長ですが)でもコピーできます。
auto &x = a[i]; // not compiling
const auto &x = a[i]; // dangerous anyway, can't prevent.
と思われます。
これらはまた、別のアプローチである:クラス定義されたユーザとしての要素を格納する、BigNumberElement
言います。我々が使用することを容易にするためにBigNumberElement、このような比較として(も変換を介して行うことができます)、割り当て、コンストラクタなどに全体の集合演算子を宣言する必要が
class BigNum {
// some code
private:
BigNumberElement array_[10];
}
:私たちは今のようにクラスBIGNUMを定義します。
auto x = a[i]
は、ほとんどの場合、BigNumberElementのコピーを取得します。それに割り当てるだけで、例外がスローされ、実行時のオーバーヘッドが発生することがあります。でも、まだauto x = static_cast<T>(a[i])
と書くことができます(それでもなお冗長ですが...)。そして、私が見る限り、予想外のコンパイル時のエラーメッセージは予期しない実行時の例外よりも優れています。
BigNumberElementをコピー/移動不可能にすることもできますが、最初のアプローチと同じになります。 (メンバー関数がBigNumberElement &
を返した場合、予期しない実行時例外が戻ってきます。)
個々の数字のみを設定するか取得する必要がありますか?次に、可能なオーバーフローで生きなければならないか、 'operator []'関数によって返され、 'operator ='関数が値を検証する何らかのラッパークラスを作ります。 –
リンク先の回答がわからないのはなぜですか?問題のあるコードを投稿してください。 – molbdnilo
私はその答えには何の問題もありません@molbdnilo設定データが無効である場合、例外をスローしたい 無効なデータは1桁が負でも10よりも大きいことはできません –