Мой профессор дал нам упражнение, в котором мы должны решить, когда уместно использовать assert (check_inv ()), который сохраняет возражаемое в правильном состоянии с соблюдением инварианта класса.
Я не уверен, когда необходимо проверять инвариант класса, я знаю, что перед возвратом объекта из его конструктора хорошей практикой является проверка инварианта класса, но в случае других функций я не совсем уверен.
это текст экзамена:
class C
{
public:
bool check_inv() const
{
// Implementation of class invariant code
}
C(int a, int b)
{
// Implementation of class constructor.
}
void foo(C& y)
{
// Implementation of method foo.
}
void bar(const C& y)
{
// Implementation of method bar.
}
void ying(const C& y)
{
// Implementation of method ying.
}
void yang(const C& y) const
{
// Implementation of method yang.
}
~C()
{
// Implementation of class destructor.
}
static void zen(int i, double d)
{
//Implementation of method zen.
}
// ... Some other code ...
}; // class C
Где я должен проверить инвариант класса?
РЕДАКТИРОВАТЬ: это не должно быть домашнее задание вообще, мне просто нужно понять работу утверждений на примере.
Подумайте о жизненном цикле объекта: он создается конструктором, он проверяется const
функции-члены, он модифицируется неconst
функции-члены, и в конечном итоге он разрушается деструктором. Таким образом, что касается инварианта класса, он должен выполняться в конце конструктора и в конце любогоconst
функции-члены. Этого достаточно, чтобы гарантировать, что инвариант выполняется везде. Проверка его при входе в функцию не делает класс надежным; он может обнаружить перезаписи извне, но это не часть абстракции, которую представляет класс. Итак: проверьте инвариант в конце каждого конструктора и в конце каждогоconst
функция-член.
Возможно, вам следует проверять инвариант класса во всех других открытых функциях-членах класса, кроме функции-деструктора. И вам нужно проверять дважды, сначала после входа в функцию, а затем перед выходом из функции, в то время как между этими двумя процессами вы можете выполнить sth для инварианта.