template<class T>
class SafeMember {
public:
T _; /* short name for convenience */
SafeMember(T const& obj) : _(obj) { }
};
:
class Student {
public:
Student(string surname, Color hairColor)
: surname(surname)
, hairColor(hairColor) { }
Student(Student const& other)
: surname(other.surname)
, hairColor(other.hairColor) { }
Student& operator=(Student const& other) {
surname = other.surname;
hairColor = other.hairColor;
return *this;
}
string getSurname() const { return surname._; }
// The foo._ syntax is better than implicit conversion because
// it lets us call member functions, like substr in this example:
bool isSlavic() const {return surname._.substr(surname._.size()-2)=="ev";}
void dyeHair(Color newColor) { hairColor = newColor; }
private:
SafeMember<string> surname;
SafeMember<Color> hairColor;
};
あなたが「SafeMember<int> age
」メンバーを追加し、コピーコンストラクタを更新するのを忘れたときに今、コンパイルが親切に失敗します。
"ノーオペレーション"ヒントの場合、開発者は ":age(0)"のようなイニシャライザを追加します。
注:これは演算子=()またはserialize()関数をビットロートから保護するものではなく、コンストラクタのみを保護します。うまくいけば、これで十分であるはずです:コンストラクタからの抜けが見えたら、おそらく他の関数も覚えているでしょう。
。 –
さて、SafeMemberは、それらをラップするのに十分簡単です。私は、OPがそれらを包むのを避けたいと思う。 –
申し訳ありませんが、新しいメンバ変数で動作します.. 私は既定のコンストラクタのリマインダを持っています。 – bayda