template<class T>
class SafeMember {
public:
T _; /* short name for convenience */
SafeMember(T const& obj) : _(obj) { }
};
wie folgt verwendet:
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;
};
Nun, wenn Sie ein „SafeMember<int> age
“ Mitglied hinzufügen und vergessen Sie Ihre Kopie-Konstruktor zu aktualisieren, nicht die Kompilierung wird hilfreich.
Und für einen "no-op" Hinweis würde der Entwickler einen Initialisierer wie ": age (0)" hinzufügen.
Hinweis: dies schützt nicht Ihre Operator =() oder serialize() -Funktionen von bit-rot, nur die Konstruktoren. Hoffentlich sollte dies jedoch genug sein: Wenn Sie Ihre Auslassungen in den Konstruktoren sehen, werden Sie wahrscheinlich daran denken, auch die anderen Funktionen zu durchlaufen.
"nicht alle Mitglieder Weg". –
Nun, SafeMember macht es einfach genug, sie zu wickeln. Ich denke, OP möchte vermeiden, sie manuell zu verpacken. –
Sorry, aber es funktioniert mit neuen Member-Variable .. Ich habe Erinnerung nur für Standardkonstruktor. – bayda