Re: Структура для ортогонального списка
От: Eugene B.  
Дата: 23.11.10 14:31
Оценка:
Сразу бросается в глаза попытка вызвать один коструктор из другого, например:
SubNode(T val,ListNode * parent) : SubNode()

Так вызывается конструктор класса-предка, а перегруженный конструктор так вызвать не получится.

Еще нашел ошибку здесь:
next=parent=0;

parent и next — это указатели на разные типы (оператор присваивания parent=0 возврщает указатель на ListNode, а присваивать это дело пытается SubNode)

Пока что все, что могу сказать.

Здравствуйте, r1der, Вы писали:

R>
R>template <typename T>
R>struct ListNode
R>{
R>  struct SubNode
R>  {
R>     SubNode(T val,ListNode * parent) : SubNode()
R>     {
R>         if (debug) cout<<"SubNode constructor(T,parent)"<<endl;
         this->>parent=parent;
R>         *value=val;
R>     }

R>     SubNode(T val) : SubNode()
R>     {
R>         if (debug) cout<<"SubNode constructor(T)"<<endl;
R>         *value=val;
R>     }

R>     SubNode()
R>     {
R>         if (debug) cout<<"SubNode default constructor"<<endl;
R>         next=parent=0;
R>         value=new T();
R>     }

R>     ~SubNode()
R>     {
R>         if (debug) cout<<"SubNode destructor"<<endl;
R>         delete value;
R>     }

R>     void debug()
R>     {
R>       if (debug)
R>         cout<<"\n\n-------- DEBUG PRINT -------\nstruct SubNode\nValue="<<*value<<"  Value address="<<value<<"\nNext address:"<<next<<"\nParent address:"<<parent<<"\n----------------------------\n\n";
R>     }

R>     T * value;
R>     SubNode * next;
R>     ListNode * parent;
R>  };

R>    ListNode()
R>    {
R>        if (::debug) cout<<"ListNode default constructor"<<endl;
R>        value=new T();
R>    }

R>    ListNode(T val) : ListNode()
R>    {
R>      if (::debug) cout<<"ListNode constructor(T)"<<endl;
R>      *value=val;
R>    }

R>    ~ListNode()
R>    {
R>        if (::debug) cout<<"ListNode destructor"<<endl;
R>        delete value;
R>    }

R>    void debug()
R>    {
R>      if (debug)
R>        cout<<"\n\n-------- DEBUG PRINT -------\nstruct ListNode\nValue="<<*value<<"  Value address="<<value<<"\nNext address:"<<next<<"\nChild address:"<<child<<"\n----------------------------\n\n";
R>    }

R>    T * value;
R>    ListNode * next;
R>    SubNode * child;
R>};

R>template <typename T>
R>struct SpecialList
R>{
R>   SpecialList()
R>   {
R>       if (debug) cout<<"SpecialList default constructor"<<endl;
R>       head=new ListNode<T>();
R>   }
R>   SpecialList(T val)
R>   {
R>       if (debug) cout<<"SpecialList constructor(val)"<<endl;
R>       head=new ListNode<T>(val);
R>   }

R>   ~SpecialList()
R>   {
R>       ListNode<T> * temp;
R>       for (ListNode<T> * current=head; head->next!=0;)
R>       {
R>           if (current->next!=0) temp=current->next;
R>           cout<<"Delete element "<<current<<"\n";
R>           delete current;
R>           current=temp;
R>       }
R>   }
R>   ListNode<T> * head;
R>};

R>


R>Имеются ли тут какие-то ошибки?

R>Как создать SubNode
R>ListNode::SubNode <int> ошибка, не получается.
R>Как проверить код на утечки памяти и "не красивые" места(стат.анализ)?
R>Может быть уже готовые структуры для этого, скажем в stl или boost, лучше первое конечно.
R>Лучше value везде хранить по указателю или же по значению? Делаю по указателю чтобы при копировании, например предавая в какой либо метод, или в качестве value выступает класс какой-нибудь, чтобы реже происхдило копирование этого объекта
R>Спасибо за ответы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.