Я написал простой класс двоичного дерева на C ++ и хочу добавить к нему оператор вывода.Моя первая попытка была:
ostream& operator<<(ostream& out, const Tree& tree) {
out << tree.myData;
if (tree.myLeft)
out << "(" << (*tree.myLeft) << ")";
if (tree.myRight)
out << "[" << (*tree.myRight) << "]";
return out;
}
(где myLeft и myRight - указатели на левого и правого потомка текущего дерева, соответственно).Это работает правильно, однако, это не достаточно круто, так как он занимает несколько строк и требует несколько раз вывести «out».
В качестве попытки создать однострочный оператор я написал следующее:
ostream& operator<<(ostream& out, const Tree& tree) {
return (out << tree.myData
<< "(" << (tree.myLeft? *tree.myLeft: "") << ")"
<< "[" << (tree.myRight? *tree.myRight: "") << "]");
}
Но возникает ошибка:
несовместимые типы операндов ('Tree' и 'const char [1]')
Поэтому я попробовал это:
ostream& operator<<(ostream& out, const Tree& tree) {
return (&tree?
out << tree.myData
<< "(" << *(tree.myLeft) << ")"
<< "[" << *(tree.myRight) << "]":
out);
}
Это работает на моем компьютере, но генерирует предупреждение, подразумевающее, что это неопределенное поведение:
Ссылка не может быть привязана к нулевому указателю с разыменованным указателем в лунке-определенный код C ++;Можно предположить, что указатель всегда преобразуется в true [-Wundefined-bool-преобразование]
ВОПРОС: Есть ли способ записать этот оператор вывода в простом одиночном утверждении?