C++ 委托给链表输出问题
我在书中写了一章关于授权给链表。当我编译本书中的示例时: 例如:C++ 委托给链表输出问题,c++,C++,我在书中写了一章关于授权给链表。当我编译本书中的示例时: 例如: 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 << "\
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();
}
我遵照编译器的建议,使用了静态函数
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;
};
即使程序能够说零件号已被重复,零件号在类中也没有变化。
我试图确保我的声明与我的定义相同,并且遵循了编译器的建议。我该如何修理。谢谢。你如何解决什么问题?也许你可以重新设计你的问题,明确指出你的问题所在,而不是发布数千行代码。你遗漏了一个必需的符号和。返回到原始代码并尝试使用
{partslist.Iterate(&Part::Display);}
实现ShowAll
,我认为它的零件号在零件中没有改变,但CarPart中的零件号在改变。如何确保在创建新的CarPart时,CarPart中的partNumber会部分更改其partNumber?
./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); }
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;
};
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...