Предположим, что у меня есть класс C++, и я хотел бы иметь рекурсивный член-функцию, которая вызывается с экземплярами элементов класса, напримерПроверка этого == NULL в качестве члена-функции, не прибегая к непредсказуемому поведению
// the eplicit "this" is just for clarity in the following code:
void recursivePrintTree(){
(if this == NULL){ // We are "out" of the tree
return;
}
cout << this->val;
(this->leftSon)->printBinaryTree();
(this->rightSon)->printBinaryTree();
}
Проблема заключается, конечно, в вызове неопределенного поведения, вызвав printBinary с NULL в первую очередь! поэтому я хотел бы избежать этого, и насколько я знаю, у меня есть по крайней мере три способа сделать это:
1) Использование статических функций-членов, которые получают явный аргумент этого типа, который можно безопасно проверять. это на самом деле то, что я сделал до сих пор, но поскольку это очень рекурсивная реализация, почти все функции-члены кодируются как статические. Это не очень хорошо, не так ли?
2) проверка состояния останова для узла следующего перед другим рекурсивным вызовом с указателем NULL, возможно, как «это». Это гораздо менее естественная форма написания и на самом деле проверяет другие предметы, что это. и я хотел бы избежать этого.
3) Использование стандартных фиктивных значений. Пробовал это, почувствовав, что это не спасает меня каким-либо специальным случаем, но это, возможно, было только из-за родословности моего дерева.
Я действительно беспокоился об этом вопросе какое-то время, поэтому буду признателен за любые полезные советы.
'this' не может быть' NULL', потому что по крайней мере у вас есть объект, который звонит этот метод. – deepmax
... какой синтаксис это? – 2013-05-04 11:30:35
Вместо этого напишите 'if (! This)'. Это более идиоматично. – jrok