Правильное использование assert () в переполнении стека

Мой профессор дал нам упражнение, в котором мы должны решить, когда уместно использовать 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

Где я должен проверить инвариант класса?

РЕДАКТИРОВАТЬ: это не должно быть домашнее задание вообще, мне просто нужно понять работу утверждений на примере.

1

Решение

Подумайте о жизненном цикле объекта: он создается конструктором, он проверяется const функции-члены, он модифицируется неconst функции-члены, и в конечном итоге он разрушается деструктором. Таким образом, что касается инварианта класса, он должен выполняться в конце конструктора и в конце любогоconst функции-члены. Этого достаточно, чтобы гарантировать, что инвариант выполняется везде. Проверка его при входе в функцию не делает класс надежным; он может обнаружить перезаписи извне, но это не часть абстракции, которую представляет класс. Итак: проверьте инвариант в конце каждого конструктора и в конце каждогоconst функция-член.

2

Другие решения

Возможно, вам следует проверять инвариант класса во всех других открытых функциях-членах класса, кроме функции-деструктора. И вам нужно проверять дважды, сначала после входа в функцию, а затем перед выходом из функции, в то время как между этими двумя процессами вы можете выполнить sth для инварианта.

0

По вопросам рекламы [email protected]