Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
3 / 3 / 0
Регистрация: 02.04.2017
Сообщений: 273
1

Перегрузка оператора << по выводу дерева в поток

22.09.2017, 11:45. Показов 857. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В чем проблема и как исправить?

Дерево
Bash
1
btree.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Btree
{
public:
    Btree();
    virtual ~Btree();
    
    void bstInsert(const Square& square);
    void bstRemove(const Square& square);
 
    friend std::ostream& operator << (std::ostream& os, const Btree& Btree); //!
    
private:
    BTreeItem* m_root;
};
Элемент дерева

Bash
1
Btree_item.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class BTreeItem
{
public:
    BTreeItem(const Square& square);
 
    void setLeft(BTreeItem* left); 
    void setRight(BTreeItem* right);
    BTreeItem* getLeft();
    BTreeItem* getRight();
    Square getSquare() const;
    virtual ~BTreeItem ();
 
private:
    Square m_square;
    BTreeItem* m_left;
    BTreeItem* m_right;
};
Перегрузка оператора
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void print(std::ostream& os, const Btree& item)
{
print(os,item->getLeft());
os<<getSquare()<<" ";
print(os,getRight());
}
 
std::ostream& operator<<(std::ostream& os, const Btree& btree) 
{
    BTreeItem *item=btree.m_root;
    
    if (item==nullptr)  
    {
    os << "================" << std::endl;
    os << "Tree is empty" << std::endl; 
    }
    
    print(std::ostream& os, *item);
    return os;
}
И ошибки
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
btree.cpp: In function ‘void print(std::ostream&, const Btree&)’:
btree.cpp:40:14: error: base operand of ‘->’ has non-pointer type ‘const Btree’
 print(os,item->getLeft());
              ^
btree.cpp:41:15: error: ‘getSquare’ was not declared in this scope
 os<<getSquare()<<" ";
               ^
btree.cpp:42:19: error: ‘getRight’ was not declared in this scope
 print(os,getRight());
                   ^
btree.cpp: In function ‘std::ostream& operator<<(std::ostream&, const Btree&)’:
btree.cpp:58:20: error: expected primary-expression before ‘&’ token
  print(std::ostream& os, *item);
                    ^
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.09.2017, 11:45
Ответы с готовыми решениями:

Перегрузка оператора вывода в поток
Реализую класс матриц. Пытаюсь перегрузить &lt;&lt;. Студия выдает: &quot;слишком много параметров для...

Перегрузка оператора вывода в поток
Собственно есть программка (большинство функций выкинул чтобы не запутывали) по работе с дробными...

Перегрузка оператора запись в поток
Здравствуйте! Подскажите, пожалуйста, возможно ли так реализовать: #include &lt;fstream&gt; class...

Перегрузка оператора запись в поток множества данных
Здравствуйте! Я использую такой код: template&lt;typename T&gt; void operator &gt;&gt; (const T&amp; str) {...

2
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,519
22.09.2017, 11:59 2
Цитата Сообщение от Key27 Посмотреть сообщение
print(os,item->getLeft());
а здесь не точка ли должна быть?
Цитата Сообщение от Key27 Посмотреть сообщение
void print(std::ostream& os, const Btree& item)
глобальная функция
соответственно она ничего не знает про
Цитата Сообщение от Key27 Посмотреть сообщение
getSquare()
которая является методом класса BTreeItem
1
3 / 3 / 0
Регистрация: 02.04.2017
Сообщений: 273
22.09.2017, 20:09  [ТС] 3
ValeryS, Поменял, теперь:
Bash
1
2
3
4
5
6
7
btree.cpp: In function ‘void print(std::ostream&, const Btree&)’:
btree.cpp:40:15: error: ‘const class Btree’ has no member named ‘getLeft’
 print(os,item.getLeft());
               ^
btree.cpp:42:15: error: ‘const class Btree’ has no member named ‘getRight’
 print(os,item.getRight());
               ^
Получается, что я неправильно передаю ссылку на item в print?

Добавлено через 9 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
глобальная функция
соответственно она ничего не знает про
getSquare()
которая является методом класса BTreeItem
То есть рекурсивно никак не распечатать?

Добавлено через 7 часов 37 минут
Возможно ли вообще при перегрузке оператора, внутри, объявить функцию, которая сможет использовать private-поля из класса?

То есть: Есть класс Дерево, внутри него private *К.(указатель на элемент дерева, те его Корень)
переопределяем оператор >> для Дерево
{
рекурсивная_печать(К)
}

рекурсивная_печать(К)
{
П->Лево/Право
}

Иле же "рекурсивная_печать" обязательно объявлять в классе Дерево?
Надеюсь, что понятно изложил свои мысли.
0
22.09.2017, 20:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.09.2017, 20:09
Помогаю со студенческими работами здесь

Error: Перегрузка оператора вывода в поток, виртуальные методы
Ребят помогите плиз понять в чем дело. Почему возникает ошибка? В соответствии с моими...

Вызов прегруженного оператора вывода в поток из аналогичного оператора
Программирую в c9.io с g++ получается тоже самое. Элементами стека(pointList) являются стеки(list)...

Не работает функция по выводу дерева файлов
&lt;?PHP $usr = chdir(phpmyadmin/); if ($usr == false) {echo &quot;Хрен&quot;}; opendir($usr); function...

Перегрузка оператора =
Нужно перегрузить оператор так что бы в начале строки и в конце были квадратные скобки . Все почти...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru