-1

I have created this simple program to learn shared_ptr

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

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

 };

Methods

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;
}

Tree

  class Tree 
   {
  public:
 boost::shared_ptr<Node> root;
  Tree();
  ~Tree();
  void findParent(int n, int &found, boost::shared_ptr<Node> &parent);
  void add(int n);
  void post(boost::weak_ptr<Node> q);
  void del(int n);

  };

Tree::Tree()
{
root.reset();
}

 Tree::~Tree()
{
cout << "deleting tree" << endl;
}

Tree find parent

void Tree::findParent(int n, int& found, boost::shared_ptr<Node> &parent)
{
   boost::shared_ptr<Node> 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;
  }
 }
}

Tree add

void Tree::add(int n)
 {
 int found;

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

else
{

    boost::shared_ptr<Node> 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;
    }
}
}

Main:

int THREADS_HOW_MANY = 0;

int main()
{
Tree bt;
bt.add(10);
bt.add(4);
bt.add(12);
bt.add(2);
bt.add(8);
bt.add(15);
bt.add(15);



return 0;
}

Now the q is, why is is not working, why is giving this output:

  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 tree why??

4

1 に答える 1

0

これはあなたのコードです:

// Tree::add から
boost::shared_ptr t(新しいノード(n));
boost::shared_ptr parent(新しいノード(n));
findParent(n、見つかった、親);

// tree::findParent から
boost::shared_ptr q(新しいノード(n));

したがって、プログラムは要求に応じて、値ごとにノードを 3 回作成します。shared_ptr は、すべてのノードが適切に破棄されることを保証するため、ノード デストラクタも 3 回呼び出されます。

于 2012-06-25T12:08:06.400 に答える