Указатель класса теряет участников?

У меня есть бинарное дерево, которое я ищу:

TreeNode<Vessel*>* node = this->tree_->search("PotatoFace");
string mystring = node->print();

когда я запускаю его, узел содержит правильные данные, но когда я перехожу к печати этих данных, как только я ввожу:

string TreeNode<T>::print()
{
return data_->toString();
}

'this' (который должен быть 'узлом' и иметь тот же адрес памяти, что и 'узел') имеет все свои элементы данных, включая Vessel*, установленные в null.

Любые идеи?

Спасибо!

Полный узел дерева:

#pragma once
#include <cstring>
#include <fstream>
#include <iostream>
using namespace std;

template <class T>
class TreeNode
{
private:
TreeNode<T>* greaterNode_;
TreeNode<T>* lessNode_;
TreeNode<T>* parentNode_;
TreeNode<T>* getLowest_();
T data_;


public:
TreeNode();
TreeNode(T data);
void add(T data);
bool operator==(const string &rhs);
TreeNode* search(T data);
void seqSearch(string data, TreeNode<T>* node);
void del(TreeNode<T>* root);
void toFile(ofstream& BSTFile);
TreeNode* compare(int sig[4]);
TreeNode* getRoot();
TreeNode* forward(TreeNode<T>* node);

string print();
};


template <class T>
TreeNode<T>::TreeNode(T data)
{
data_ = data;
greaterNode_ = lessNode_ = parentNode_= NULL;

}
template <class T>
TreeNode<T>::TreeNode()
{
}

template <class T>
void TreeNode<T>::seqSearch(string data, TreeNode<T>* node )
{
if(*data_ == data)
{
    *node = this->data_;
}
if(this->lessNode_)
{
    this->lessNode_->seqSearch(data, node);
}   
if(this->greaterNode_)
{
    this->greaterNode_->seqSearch(data, node);
}   
}

template <class T>
string TreeNode<T>::print()
{
return data_->toString();
}

Все еще не совсем уверен, как объяснить, почему это не работает, но это была проблема области действия, вне узлов дерева классов бинарного дерева, потерянных данных. Убраны все функции дерева, которые возвращали узлы, теперь все работает.


person lex    schedule 06.05.2012    source источник
comment
Опубликуйте определения. Кроме того, вы понимаете, что TreeNode<Vessel*>* node = new TreeNode<Vessel*>(); бесполезен, поскольку вы переназначаете node в следующей строке, что также приводит к утечке памяти?   -  person Luchian Grigore    schedule 07.05.2012
comment
исправил это, так было установлено раньше, но, пытаясь это исправить, я изменил его.   -  person lex    schedule 07.05.2012
comment
Что такое toString? Кроме того, почему вы храните указатели, а не объекты в своем классе?   -  person Luchian Grigore    schedule 07.05.2012
comment
toString() возвращает строку, содержащую все члены класса data_, который является указателем, поскольку в моем дереве есть 3 уровня наследования, поэтому он может хранить 6 различных типов судов.   -  person lex    schedule 07.05.2012
comment
Является ли TreeNode‹Vessel*›* hello = this-›tree_-›search(PotatoFace); строка mystring = node-›print(); выполняется в рамках класса или в отдельной области (например, основной функции)?   -  person Jason Zhu    schedule 07.05.2012
comment
отдельная сфера. Я нахожу это для всех своих функций, всего, что возвращает TreeNode*, данные TreeNode* удаляются при разыменовании. Действительно запутался.   -  person lex    schedule 07.05.2012
comment
Запустите вашу программу под valgrind. Это инструмент для поиска ошибок доступа к памяти.   -  person John Zwinck    schedule 07.05.2012


Ответы (2)


Вы уверены, что хотели написать:

string mystring = node->print();

нет

string mystring = hello->print();

Если да, то похоже на "это" из

string mystring = node->print();

имеет значение null (узел равен нулю). У этого может быть несколько причин:

  • узел никогда не инициализируется
  • узел должен быть установлен поиском («что-то»), но поиск возвращает ноль

Было бы очень полезно, если бы вы вставили больше кода.

person G. Martinek    schedule 07.05.2012

Все еще не совсем уверен, как объяснить, почему это не работает, но это была проблема области действия, вне узлов дерева классов бинарного дерева, потерянных данных.

Это было исправлено путем обеспечения того, чтобы класс двоичного дерева не возвращал ничего типа TreeNode*, и запуска любой другой функции, которую я хотел, как только значение узла было выполнено внутри класса двоичного дерева. Это работает сейчас. Спасибо вам за помощь!

person lex    schedule 09.05.2012