I am doing a chapter in my book about delegating to a linked list. When I compile the example in the book :
The example is:
using namespace std;
# include <iostream>
# include <headerfile.hpp>
// implementation of pure virtual function so that
// derived classes can chain up
void Part::Display() const
{
cout << "\nPart Number: " << itsPartNumber << endl;
}
CarPart::CarPart(USHORT year, ULONG partNumber):
itsModelYear(year),
Part(partNumber)
{}
AirPlanePart::AirPlanePart(USHORT EngineNumber, ULONG PartNumber):
itsEngineNumber(EngineNumber),
Part(PartNumber)
{}
// PartNode Implementations...
PartNode::PartNode(Part* pPart):
itsPart(pPart),
itsNext(0)
{}
PartNode::~PartNode()
{
delete itsPart;
itsPart = 0;
delete itsNext;
itsNext = 0;
}
// Returns NULL if no next PartNode
PartNode * PartNode::GetNext() const
{
return itsNext;
}
Part * PartNode::GetPart() const
{
if (itsPart)
return itsPart;
else
return NULL; //error
}
PartsList PartsList::GlobalPartsList;
// Implementation for Lists....
PartsList::PartsList():
pHead(0),
itsCount(0)
{}
PartsList::~PartsList()
{
delete pHead;
}
Part* PartsList::GetFirst() const
{
if (pHead)
return pHead->GetPart();
else
return NULL; // error catch here
}
Part * PartsList::operator[](ULONG offset) const
{
PartNode* pNode = pHead;
if(!pHead)
return NULL; // errror catch here
if (offset > itsCount)
return NULL; //error
for (ULONG i=0;i<offset; i++)
pNode->GetNext();
return pNode->GetPart();
}
Part* PartsList::Find(ULONG & position, ULONG PartNumber) const
{
PartNode * pNode = 0;
for (pNode = pHead, position = 0;
pNode!=NULL;
pNode = pNode->GetNext(),position++)
{
if (pNode->GetPart() ->GetPartNumber() == PartNumber)
break;
}
if (pNode == NULL)
return NULL;
else
return pNode ->GetPart();
}
void PartsList::Iterate(void (Part::*func)()const) const
{
if (!pHead)
return;
PartNode* pNode = pHead;
do
(pNode->GetPart()->*func)();
while (pNode = pNode->GetNext());
}
void PartsList::Insert(Part *pPart)
{
PartNode * pNode = new PartNode(pPart);
PartNode * pCurrent = pHead;
PartNode * pNext = 0;
ULONG New = pPart->GetPartNumber();
ULONG Next = 0;
itsCount++;
if (!pHead)
{
pHead = pNode;
return;
}
// if this one is smaller than head
// this one is the new head
if (pHead->GetPart() ->GetPartNumber() > New)
{
pNode->SetNext(pHead);
pHead = pNode;
return;
}
for (;;)
{
// if there is no next, append this new one
if (!pCurrent->GetNext())
{
pCurrent->SetNext(pNode);
return;
}
// if this goes after this one and before the next
// then insert it here, otherwise get the next
pNext = pCurrent->GetNext();
Next = pNext->GetPart()->GetPartNumber();
if (Next > New)
{
pCurrent->SetNext(pNode);
pNode->SetNext(pNext);
return;
}
pCurrent = pNext;
}
}
void PartsCatalog::Insert(Part * newPart)
{
ULONG partNumber = newPart->GetPartNumber();
ULONG offset;
if (!thePartsList.Find(offset, partNumber))
thePartsList.Insert(newPart);
else
{
cout << partNumber << " was the ";
switch (offset)
{
case 0: cout << "first "; break;
case 1: cout << "second "; break;
case 2: cout << "third "; break;
default: cout << offset+1 << "th ";
}
cout << "entry. Rejected!\n";
}
}
ULONG PartsCatalog::Exists(ULONG PartNumber)
{
ULONG offset;
thePartsList.Find(offset,PartNumber);
return offset;
}
Part * PartsCatalog::Get(int PartNumber)
{
ULONG offset;
Part * thePart = thePartsList.Find(offset, PartNumber);
return thePart;
}
void startof()
{
PartsCatalog pc;
Part * pPart = 0;
ULONG PartNumber;
USHORT value;
ULONG choice;
while (1)
{
cout << "(0)Quit (1)Car (2)Plane: ";
cin >> choice;
if (!choice)
break;
cout << "New part Number?: ";
cin >> PartNumber;
if (choice == 1)
{
cout << "ModelYear?:";
cin >> value;
pPart = new CarPart(value,PartNumber);
}
else
{
cout << "Engine Number?: ";
cin >> value;
pPart = new AirPlanePart(value,PartNumber);
}
pc.Insert(pPart);
}
pc.ShowAll();
}
And <headerfile.hpp>
contains:
typedef unsigned long ULONG;
typedef unsigned short USHORT;
using namespace std;
// ************** Part **********
// Absract base class of parts
class Part
{
public:
Part():itsPartNumber(1){}
Part(ULONG PartNumber):itsPartNumber(PartNumber){}
virtual ~Part(){};
ULONG GetPartNumber() const { return itsPartNumber; }
static int& Display();
private:
ULONG itsPartNumber;
};
// *************** Car Part **********
class CarPart : public Part
{
public:
CarPart():itsModelYear(94){}
CarPart(USHORT year, ULONG partNumber);
int Display() const { Part::Display();
cout << "Model Year: " <<
itsModelYear << endl; }
private:
USHORT itsModelYear;
};
// **************** AirPlane Part *********
class AirPlanePart : public Part
{
public:
AirPlanePart():itsEngineNumber(1){};
AirPlanePart(USHORT EngineNumber, ULONG PartNumber);
int Display() const { Part::Display();
cout << "Engine No: " << itsEngineNumber << endl; }
private:
USHORT itsEngineNumber;
};
// **************** PartNode *********
class PartNode
{
public:
PartNode (Part*);
~PartNode();
void SetNext(PartNode * node){ itsNext = node; }
PartNode * GetNext() const;
Part * GetPart() const;
private:
Part *itsPart;
PartNode * itsNext;
};
// **************** Part list ***********
class PartsList
{
public:
PartsList();
~PartsList();
// needs copy constructor and operator equals!
//void Iterate(int (&),Part Part::Display);
void PartsList::Iterate(int*);
Part* Find(ULONG & position, ULONG PartNumber) const;
Part* GetFirst() const;
void Insert(Part *);
Part* operator[](ULONG) const;
ULONG GetCount() const { return itsCount; }
static PartsList& GetGlobalPartsList() { return GlobalPartsList;}
private:
PartNode * pHead;
ULONG itsCount;
static PartsList GlobalPartsList;
};
class PartsCatalog
{
public:
void Insert(Part *);
ULONG Exists(ULONG PartNumber);
Part * Get(int PartNumber);
operator+(const PartsCatalog &);
void ShowAll() { thePartsList.Iterate(&Part::Display()) ; }
private:
PartsList thePartsList;
};
I get:
./headerfile.hpp: In member function 'void PartsCatalog::ShowAll()':
./headerfile.hpp:97:47: error: invalid use of non-static member function 'virtual void Part::Display() const'
void ShowAll() { thePartsList.Iterate(Part::Display); }
I followed the compliers advice and used static functions instead.
using namespace std;
# include <iostream>
# include <14_5hSTATIC2.hpp>
// implementation of pure virtual function so that
// derived classes can chain up
&Part::Display()
{
cout << "\nPart Number: " << &Part::itsPartNumber << endl;
}
CarPart::CarPart(USHORT year, ULONG partNumber):
itsModelYear(year),
Part(partNumber)
{}
AirPlanePart::AirPlanePart(USHORT EngineNumber, ULONG PartNumber):
itsEngineNumber(EngineNumber),
Part(PartNumber)
{}
// PartNode Implementations...
PartNode::PartNode(Part* pPart):
itsPart(pPart),
itsNext(0)
{}
PartNode::~PartNode()
{
delete itsPart;
itsPart = 0;
delete itsNext;
itsNext = 0;
}
// Returns NULL if no next PartNode
PartNode * PartNode::GetNext() const
{
return itsNext;
}
Part * PartNode::GetPart() const
{
if (itsPart)
return itsPart;
else
return NULL; //error
}
PartsList PartsList::GlobalPartsList;
// Implementation for Lists....
PartsList::PartsList():
pHead(0),
itsCount(0)
{}
PartsList::~PartsList()
{
delete pHead;
}
Part* PartsList::GetFirst() const
{
if (pHead)
return pHead->GetPart();
else
return NULL; // error catch here
}
Part * PartsList::operator[](ULONG offset) const
{
PartNode* pNode = pHead;
if(!pHead)
return NULL; // error catch here
if (offset > itsCount)
return NULL; //error
for (ULONG i=0;i<offset; i++)
pNode->GetNext();
return pNode->GetPart();
}
Part* PartsList::Find(ULONG & position, ULONG PartNumber) const
{
PartNode * pNode = 0;
for (pNode = pHead, position = 0;
pNode!=NULL;
pNode = pNode->GetNext(),position++)
{
if (pNode->GetPart() ->GetPartNumber() == PartNumber)
break;
}
if (pNode == NULL)
return NULL;
else
return pNode ->GetPart();
}
void PartsList::Iterate(int*)
{
if (!pHead)
return;
PartNode* pNode = pHead;
do
(pNode->GetPart());
while (pNode = pNode->GetNext());
Part::func;
}
void PartsList::Insert(Part *pPart)
{
PartNode * pNode = new PartNode(pPart);
PartNode * pCurrent = pHead;
PartNode * pNext = 0;
ULONG New = pPart->GetPartNumber();
ULONG Next = 0;
itsCount++;
if (!pHead)
{
pHead = pNode;
return;
}
// if this one is smaller than head
// this one is the new head
if (pHead->GetPart() ->GetPartNumber() > New)
{
pNode->SetNext(pHead);
pHead = pNode;
return;
}
for (;;)
{
// if there is no next, append this new one
if (!pCurrent->GetNext())
{
pCurrent->SetNext(pNode);
return;
}
// if this goes after this one and before the next
// then insert it here, otherwise get the next
pNext = pCurrent->GetNext();
Next = pNext->GetPart()->GetPartNumber();
if (Next > New)
{
pCurrent->SetNext(pNode);
pNode->SetNext(pNext);
return;
}
pCurrent = pNext;
}
}
void PartsCatalog::Insert(Part * newPart)
{
ULONG partNumber = newPart->GetPartNumber();
ULONG offset;
if (!thePartsList.Find(offset, partNumber))
thePartsList.Insert(newPart);
else
{
cout << partNumber << " was the ";
switch (offset)
{
case 0: cout << "first "; break;
case 1: cout << "second "; break;
case 2: cout << "third "; break;
default: cout << offset+1 << "th ";
}
cout << "entry. Rejected!\n";
}
}
ULONG PartsCatalog::Exists(ULONG PartNumber)
{
ULONG offset;
thePartsList.Find(offset,PartNumber);
return offset;
}
Part * PartsCatalog::Get(int PartNumber)
{
ULONG offset;
Part * thePart = thePartsList.Find(offset, PartNumber);
return thePart;
}
void startof()
{
PartsCatalog pc;
Part * pPart = 0;
ULONG PartNumber;
USHORT value;
ULONG choice;
while (1)
{
cout << "(0)Quit (1)Car (2)Plane: ";
cout << "\n Current Part No: " << &Part::GetPartNumber << endl;
cin >> choice;
if (!choice)
break;
cout << "New part Number?: ";
cin >> PartNumber;
if (choice == 1)
{
cout << "ModelYear?:";
cin >> value;
pPart = new CarPart(value,PartNumber);
}
else
{
cout << "Engine Number?: ";
cin >> value;
pPart = new AirPlanePart(value,PartNumber);
}
pc.Insert(pPart);
}
pc.ShowAll();
}
int main()
{
startof();
return 0;
}
// headerfile.hpp
typedef unsigned long ULONG;
typedef unsigned short USHORT;
using namespace std;
// ************** Part **********
// Absract base class of parts
class Part
{
public:
Part():itsPartNumber(1){}
Part(ULONG PartNumber):itsPartNumber(PartNumber){}
virtual ~Part(){};
ULONG GetPartNumber() const { return itsPartNumber; }
static int& Display();
private:
ULONG itsPartNumber;
};
// *************** Car Part **********
class CarPart : public Part
{
public:
CarPart():itsModelYear(94){}
CarPart(USHORT year, ULONG partNumber);
int Display() const { Part::Display();
cout << "Model Year: " <<
itsModelYear << endl; }
private:
USHORT itsModelYear;
};
// **************** AirPlane Part *********
class AirPlanePart : public Part
{
public:
AirPlanePart():itsEngineNumber(1){};
AirPlanePart(USHORT EngineNumber, ULONG PartNumber);
int Display() const { Part::Display();
cout << "Engine No: " << itsEngineNumber << endl; }
private:
USHORT itsEngineNumber;
};
// **************** PartNode *********
class PartNode
{
public:
PartNode (Part*);
~PartNode();
void SetNext(PartNode * node){ itsNext = node; }
PartNode * GetNext() const;
Part * GetPart() const;
private:
Part *itsPart;
PartNode * itsNext;
};
// **************** Part list ***********
class PartsList
{
public:
PartsList();
~PartsList();
// needs copy constructor and operator equals!
//void Iterate(int (&),Part Part::Display);
void PartsList::Iterate(int*);
Part* Find(ULONG & position, ULONG PartNumber) const;
Part* GetFirst() const;
void Insert(Part *);
Part* operator[](ULONG) const;
ULONG GetCount() const { return itsCount; }
static PartsList& GetGlobalPartsList() { return GlobalPartsList;}
private:
PartNode * pHead;
ULONG itsCount;
static PartsList GlobalPartsList;
};
class PartsCatalog
{
public:
void Insert(Part *);
ULONG Exists(ULONG PartNumber);
Part * Get(int PartNumber);
operator+(const PartsCatalog &);
void ShowAll() { thePartsList.Iterate(&Part::Display()) ; }
private:
PartsList thePartsList;
};
I managed to get it running but at the end it is supposed to put out the model numbers and model years i.e.
Part Number: 1234
Model Year: 94
Part Number: 2345
Model Year: 93
Part Number: 4434
Model Year: 93
But I get:
(0)Quit (1)Car (2)Plane:
Current Part No: 1
1
New part Number?: 1234
ModelYear?:94
(0)Quit (1)Car (2)Plane:
Current Part No: 1
1
New part Number?: 4434
ModelYear?:93
(0)Quit (1)Car (2)Plane:
Current Part No: 1
1
New part Number?: 1234
ModelYear?:94
1234 was the first entry. Rejected!
(0)Quit (1)Car (2)Plane:
Current Part No: 1
1
New part Number?: 2345
ModelYear?:93
(0)Quit (1)Car (2)Plane:
Current Part No: 1
0
Part Number: 1
Press ENTER to continue...
The part number is not even changing in the class even though the program is able to say it has been repeated. I've tried to make sure my declarations are the same as my definitions and I've followed the compilers advice. How do I fix. Thanks.