У меня этот класс (я знаю, ужасно.. Я только начинаю работать с классами в 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:
благодарю!
надеясь, что темп укажет на голову дерева, но он просто следует за темпом
Конечно, он будет указывать на temp
, потому что здесь:
Tree* tem = &temp;
Вы назначаете его с адресом temp
. затем
temp = temp.GetLeft();
Вы меняете temp
детей. Но tem
по-прежнему указывает на temp
, поэтому вы получили этот результат.
Я не вижу причин для изменения temp
с его левым ребенком. Я могу предложить вам объявить новую переменную, которая будет содержать левого ребенка...
Вы должны переписать свой класс, у него много ошибок. По крайней мере - утечка памяти. Если вы выделили (самостоятельно) память, вам необходимо вручную ее освободить.
Вместо этого используйте интеллектуальные указатели и не используйте конструктор с Tree*
качестве аргументов. Это может быть опасно.
Это здорово узнать все сразу. Но это не работает.