help! how to implement a copy constructor in c++ for ADT queues??

Please support our C++ advertiser: Intel Parallel Studio Home
Reply

Join Date: Oct 2007
Posts: 3
Reputation: ecestd1 is an unknown quantity at this point 
Solved Threads: 0
ecestd1 ecestd1 is offline Offline
Newbie Poster

help! how to implement a copy constructor in c++ for ADT queues??

 
0
  #1
Oct 28th, 2007
how do you implement a copy constructor for this pointer-based ADT
queue
  1. #include "Queuep.h"
  2. #include <cassert>
  3. #include <new>
  4. using namespace std;
  5.  
  6. Queue::Queue () : backPtr (0), frontPtr(0)
  7. {
  8. }
  9.  
  10. Queue::Queue(const Queue& Q) throw(OutOfStorageException)
  11. {
  12. //implement here
  13.  
  14. }//end copy constructor
  15.  
  16. Queue::~Queue()
  17. {
  18. while ( !isEmpty() )
  19. {
  20. dequeue();
  21.  
  22. }//end while
  23. }//end destructor
  24.  
  25. assert( (backPtr == 0) && (frontPtr == 0) )
Last edited by Ancient Dragon; Oct 28th, 2007 at 9:30 am. Reason: add code tags
Reply With Quote Quick reply to this message  
Join Date: May 2007
Posts: 1,859
Reputation: twomers has a spectacular aura about twomers has a spectacular aura about twomers has a spectacular aura about 
Solved Threads: 55
twomers's Avatar
twomers twomers is offline Offline
Posting Virtuoso

Re: help! how to implement a copy constructor in c++ for ADT queues??

 
0
  #2
Oct 28th, 2007
Erm. Copy all relivant data?
By the looks of it start at the back pointer and iterate to the front pointer assigning the values at each of the nodes (from Q), to your object along the way.
I blag!?
"Mr Kitty, you have to live in the attic now. Here, write a diary."
I am the Walrus!
Reply With Quote Quick reply to this message  
Join Date: Aug 2005
Posts: 15,343
Reputation: Ancient Dragon has a reputation beyond repute Ancient Dragon has a reputation beyond repute Ancient Dragon has a reputation beyond repute Ancient Dragon has a reputation beyond repute Ancient Dragon has a reputation beyond repute Ancient Dragon has a reputation beyond repute Ancient Dragon has a reputation beyond repute Ancient Dragon has a reputation beyond repute Ancient Dragon has a reputation beyond repute Ancient Dragon has a reputation beyond repute Ancient Dragon has a reputation beyond repute 
Solved Threads: 1460
Team Colleague
Featured Poster
Ancient Dragon's Avatar
Ancient Dragon Ancient Dragon is offline Offline
Still Learning

Re: help! how to implement a copy constructor in c++ for ADT queues??

 
0
  #3
Oct 28th, 2007
Learn to format your code better so that you can see what you're doing. Only takes a couple seconds to hit that space bar.
Don't PM me with questions -- you might get a nasty PM in response. If you have a question then post it in one of the forums.
Reply With Quote Quick reply to this message  
Join Date: Oct 2007
Posts: 3
Reputation: ecestd1 is an unknown quantity at this point 
Solved Threads: 0
ecestd1 ecestd1 is offline Offline
Newbie Poster

Re: help! how to implement a copy constructor in c++ for ADT queues??

 
0
  #4
Oct 29th, 2007
thanks
Reply With Quote Quick reply to this message  
Join Date: Oct 2007
Posts: 3
Reputation: ecestd1 is an unknown quantity at this point 
Solved Threads: 0
ecestd1 ecestd1 is offline Offline
Newbie Poster

Re: help! how to implement a copy constructor in c++ for ADT queues??

 
0
  #5
Oct 29th, 2007
I did implement the copy constructor but still its not working what could be the problem?

/** @file
*
* @course CS1521
* @section 1
*
* Pointer-based <tt>Queue</tt> class implementation.<br>
* Adapted from page 352-4 in Carrano 5e.
*
* @author Frank M. Carrano
* @author Steve Holtz
* @date 3/11/2007
* @version 5.1 */

#include "QueueP.h"
#include <cassert> // for assert
#include <new> // for bad_alloc
#include <iostream>
//typedef std::queue<QueueItemType> Queue;
using namespace std;
//private:{Queue::Queue(const Queue& Q)}


Queue::Queue() : backPtr(0), frontPtr(0)//copy constructor initializes the data members
{
} // end default constructor

Queue::Queue(const Queue& Q) throw(OutOfStorageException)// because the compiler-generated default constructorwould not necessarily initialize data members to appropriate values, you must create your own. pg 198
//:backPtr(const Queue& Q)
//:frontPtr (const Queue& Q)
if (Q.frontPtr == 0)
frontPtr = 0; // original Queue is empty

else
{ // copy first node
try
{
frontPtr = new QueueNode;
frontPtr->item = Q.frontPtr->item;

// copy rest of Queue
QueueNode *newPtr = frontPtr; // new Queue pointer
// newPtr points to last node in new Queue
// origPtr points to nodes in original Queue
for (QueueNode *origPtr = Q.frontPtr->next;
origPtr != 0;
origPtr = origPtr->next)
{ newPtr->next = new QueueNode;
newPtr = newPtr->next;
newPtr->item = origPtr->item;
} // end for

newPtr->next = 0;
} // end try
catch (bad_alloc e)
{
throw OutOfStorageException(
"OutOfStorageException: Cannot allocate memory in copy constructor.");
} // end catch
} // end if
} // end copy constructor

Queue::~Queue()
{
while (!isEmpty() )
{
dequeue();
} // end while
assert ( (backPtr == 0) && (frontPtr == 0) );
} // end destructor

bool Queue::isEmpty() const
{
return backPtr == 0;
} // end isEmpty

void Queue::enqueue(const QueueItemType& newItem)
throw(OutOfStorageException)
{
try
{
QueueNode *newPtr = new QueueNode;

newPtr->item = newItem;

newPtr->next = 0;

if (isEmpty() )
{
frontPtr = newPtr;
}
else
{
backPtr->next = newPtr;
} // end if

backPtr = newPtr;
}
catch(bad_alloc e)
{
throw OutOfStorageException("Memory allocation failed.");
} // end try/catch
} // end enqueue

void Queue::dequeue() throw(OutOfDataException)
{
if (isEmpty() )
{
throw OutOfDataException("Empty queue, cannot dequeue");
}
else
{ // queue is not empty; remove front
QueueNode *tempPtr = frontPtr;
if (frontPtr == backPtr) // special case?
{ // yes, one node in queue
frontPtr = 0;
backPtr = 0;
}
else
{
frontPtr = frontPtr->next;
} // end if
tempPtr->next = 0; // defensive strategy
delete tempPtr;
// }
} // end if
} // end dequeue

void Queue::dequeue(QueueItemType& queueFront)
throw(OutOfDataException)
{
if (isEmpty() )
{
throw OutOfDataException("Empty queue, cannot dequeue");
}
else
{ // queue is not empty; retrieve front
queueFront = frontPtr->item;
dequeue(); // delete front
} // end if
} // end dequeue

void Queue::getFront(QueueItemType& queueFront) const
throw(OutOfDataException)
{
if (isEmpty() )
{
throw OutOfDataException("Empty queue, cannot getFront");
}
else
{
// queue is not empty; retrieve front
queueFront = frontPtr->item;
} // end if
} // end getFront
Reply With Quote Quick reply to this message  
Reply

This thread is more than three months old.
Perhaps start a new thread instead?
Message:


Thread Tools Search this Thread



About Us | Contact Us | Advertise | DaniWeb | Acceptable Use Policy | RSS Feed

©2003 - 2009 DaniWeb® LLC