Я заинтересован в том, чтобы сделать что-то вроде следующего, чтобы придерживаться шаблона проектирования Null Object и избежать тщательных тестов NULL:
class Node;
Node* NullNode;
class Node {
public:
Node(Node *l=NullNode, Node *r=NullNode) : left(l), right(r) {};
private:
Node *left, *right;
};
NullNode = new Node();
Конечно, как написано, NullNode имеет разные области памяти до и после объявления класса Node. Вы можете сделать это без предварительного объявления, если вы не хотите иметь аргументы по умолчанию (т.е. удалить Node * r = NullNode).
Другой вариант мог бы использовать наследование: создать родительский класс (Node) с двумя дочерними элементами (NullNode и FullNode). Тогда приведенный выше пример узла будет кодом для FullNode, а NullNode в приведенном выше коде будет иметь тип NullNode, наследуемый от Node. Я ненавижу решать простые проблемы путем обращения к наследству.
Итак, вопрос в том, как применить шаблоны Null Object к рекурсивным структурам данных (классам) с аргументами по умолчанию (которые являются экземплярами того же класса!) В C ++?