Указатель на голову дерева

0

У меня этот класс (я знаю, ужасно.. Я только начинаю работать с классами в c++, а указатели вроде бы становятся для меня трудными, так.. :)):

class Tree{
private:
    Tree* Left;
    Tree* Right;
    int info;
    Tree* GetTree(int num){
        return new Tree(num);
    }
public:
    Tree() :info(0) ,Left(nullptr), Right(nullptr) {};
    Tree(int num) : info(num), Left(nullptr) , Right(nullptr){};
    Tree(int num,Tree* L,Tree* R) : info(num), Left(L), Right(R) {};
    void SetLeft(Tree* L){Left = L;};
    void SetRight(Tree* R){Right = R;};
    void SetLeft(Tree L){Left = &L;};
    void SetRight(Tree R){Right = &R;};
    void SetLeft(int num){Left = GetTree(num);};
    void SetRight(int num){Right = GetTree(num);};
    void SetInfo(int num){info = num;};
    Tree GetLeft(){return (Left==nullptr) ? Tree() : *Left;};
    Tree GetRight(){return (Right==nullptr) ? Tree() : *Right;};
    Tree* GetLeft(bool ptr){return Left;};
    Tree* GetRight(bool ptr){return Right;};
    int GetInfo(){return info;};
};

(В основном этот класс создает дерево, у которого есть 2 листа (еще два дерева), слева и справа, и у каждого из них больше 2 листьев и т.д.), Поэтому я сделал это:

Tree temp(5);
Tree* tem = &temp;
temp.SetInfo(10);
temp.SetLeft(5);
temp = temp.GetLeft();
cout << tem->GetInfo();

надеясь, что темп укажет на голову дерева, но он просто следует за темпом.. есть ли способ сделать это легко?

Можете ли вы, ребята, помочь мне с классом? Мне сложно совмещать указатели и классы S:

благодарю!

Теги:
pointers
oop

1 ответ

1
Лучший ответ

надеясь, что темп укажет на голову дерева, но он просто следует за темпом

Конечно, он будет указывать на temp, потому что здесь:

Tree* tem = &temp;

Вы назначаете его с адресом temp. затем

temp = temp.GetLeft();

Вы меняете temp детей. Но tem по-прежнему указывает на temp, поэтому вы получили этот результат.

Я не вижу причин для изменения temp с его левым ребенком. Я могу предложить вам объявить новую переменную, которая будет содержать левого ребенка...

Но, во-первых,

Вы должны переписать свой класс, у него много ошибок. По крайней мере - утечка памяти. Если вы выделили (самостоятельно) память, вам необходимо вручную ее освободить.

Вместо этого используйте интеллектуальные указатели и не используйте конструктор с Tree* качестве аргументов. Это может быть опасно.

Так:

Это здорово узнать все сразу. Но это не работает.

  • Узнайте, как использовать указатели (отдельно от использования классов)
  • Узнайте, как использовать классы (отдельно от использования указателей)
  • Изучайте указатели и классы вместе
  • 0
    Да, я видел, что у меня там была ошибка ... я пытаюсь создать дерево, поэтому мне нужно переместить временную шкалу влево и вправо, пример, который я привел выше, является краткой версией того, что я пытаюсь сделать. Есть ли способ создать указатель на вершину дерева, не заставляя его следовать вместе с темпом? Что касается класса, я исправлю это позже, я сделал это, потому что я понятия не имел, как исправить некоторые проблемы, я буду иметь дело с этим позже, спасибо!
  • 0
    Кстати, я действительно научился использовать их по отдельности, используя их вместе? .. да .. не моя сильная сторона (+ я не могу найти хороший учебник об этом, и моя книга этому не учит) ..)
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню