شجرة مع زيادة shared_ptr

لقد قمت بإنشاء هذا البرنامج البسيط لتعلم shared_ptr

using namespace std;
 #define Yes 1
 #define No 0

class Node
{
public:
boost::shared_ptr left;
boost::shared_ptr rigth;
int nVal;
Node();
Node(int);
~Node();
int getVal(void);
void setVal(int);

 };

أساليب

Node::Node()
{
cout << "creating node empty" << endl;
nVal = 0;
left.reset();
rigth.reset();

}

Node::~Node() 
{
cout << "entering destructor"  << nVal << endl;
}

Node::Node(int n)
{
cout << "creating node with value" << n << endl;
nVal = n;
left.reset();
rigth.reset();
}

int Node::getVal(void)
{
cout << "returning value" << endl;
return this->nVal;
}

void Node::setVal(int n)
{
cout << "setting value" << endl;
nVal = n;
}

شجرة

  class شجرة 
   {
  public:
 boost::shared_ptr root;
  شجرة();
  ~شجرة();
  void findParent(int n, int &found, boost::shared_ptr &parent);
  void add(int n);
  void post(boost::weak_ptr q);
  void del(int n);

  };

شجرة::شجرة()
{
root.reset();
}

 شجرة::~شجرة()
{
cout << "deleting شجرة" << endl;
}

شجرة find parent

void شجرة::findParent(int n, int& found, boost::shared_ptr &parent)
{
   boost::shared_ptr q;
  found = No;

 cout << "looking parent of" << n << endl;
 if(parent.use_count() == 0)
 {
  cout << "not found" << endl;
  return;
  }

q=parent;

 while (!q.use_count())
{
  if( q->nVal == n)
  {
      cout << "found" << endl;
      found = Yes;
      return;

  }

  if (q->rigth->nVal)
  {
      cout << "looking to the rigth" << endl;
      parent = q;
      q = q->left;
  }
  else
  {
      cout << "looking to the left" << endl;
      parent = q;
      q = q->rigth;
  }
 }
}

شجرة add

void شجرة::add(int n)
 {
 int found;

boost::shared_ptr parent;
findParent(n, found,parent);
if(found == Yes)
{
    cout << "no such node exist" << endl;
}

else
{

    boost::shared_ptr t(new Node(n));  
    t->rigth.reset();
    t->left.reset();

    if (parent.get()== 0)
    {
        parent = t;
    }
    else
    {
        parent->nVal > n ? parent->left = t : parent->rigth = t;
    }
}
}

الأساسية:

int THREADS_HOW_MANY = 0;

int main()
{
شجرة bt;
bt.add(10);
bt.add(4);
bt.add(12);
bt.add(2);
bt.add(8);
bt.add(15);
bt.add(15);



return 0;
}

الآن q ، لماذا لا يعمل ، لماذا يتم إعطاء هذا الإخراج:

  empty constructor only the root is reset
  looking parent of10
  not found
  creating node with value10
  entering destructor10
  looking parent of4
  not found
  creating node with value4
  entering destructor4
  looking parent of12
  not found
  creating node with value12
  entering destructor12
 looking parent of2
 not found
  creating node with value2
 entering destructor2

Fixed it now is diff it seem that the nodes are just being created and deleted not added to a شجرة why??

1
parent.reset ()؛ إذا كان (parent.use_count() == 0)//هذا صحيح دائمًا!
وأضاف المؤلف Igor R., مصدر
ف = الأم. بينما (! q.use_count ())//always false ، لن يتم تشغيل الحلقة باختصار ، لا يمكنك فقط الخطوة التعليمات البرمجية الخاصة بك في المصحح ونرى ما يذهب هناك ؟!
وأضاف المؤلف Igor R., مصدر
غيرت ذلك (، شكرا. لا تزال لا تسير بشكل صحيح
وأضاف المؤلف Pedro.Alonso, مصدر
نعم سأقوم ، kiitos (الفنلندية)
وأضاف المؤلف Pedro.Alonso, مصدر

1 إجابة

هذه هي شفرتك:

// from Tree::add
boost::shared_ptr t(new Node(n));
boost::shared_ptr parent(new Node(n));
findParent(n, found,parent);

// from tree::findParent
boost::shared_ptr q(new Node(n));

لذلك ، ينشئ البرنامج عقدة لكل قيمة 3 مرات ، كما هو مطلوب. يضمن shared_ptr ، أن كل عقدة يتم تدميرها بشكل صحيح ، لذلك يسمى عقدة destructor 3 مرات كذلك.

0
وأضاف
طيب كيف يمكنني إصلاحه (: ، كيف يمكنني أن أقول أنه يشير إلى العقدة التي تم إنشاؤها فقط وليس مرة أخرى.
وأضاف المؤلف Pedro.Alonso, مصدر
nv حصلت عليه بحذف الأجزاء الجديدة من العقدة (n) التي ما زلت لا أعرف لماذا لا تشير إلى الأبناء.
وأضاف المؤلف Pedro.Alonso, مصدر