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...