0

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.

3442
  • 8,248
  • 2
  • 19
  • 41
AlleyCat
  • 41
  • 6
  • How do you fix what ? May you can reformulate your question to specifically point out what's your problem instead of posting thousands lines of code. – clickMe Feb 04 '17 at 11:50
  • 1
    You left out a required ampersand. Go back to your original code and try implementing `ShowAll` with `{ thePartsList.Iterate(&Part::Display);}` – Spencer Feb 04 '17 at 12:16
  • Possible duplicate of [C++ Pointer to virtual function](http://stackoverflow.com/questions/6754799/c-pointer-to-virtual-function) – Spencer Feb 04 '17 at 12:25
  • I think itsPartNumber in Part is not changing but partNumber in CarPart is changing. How can I make sure partNumber in CarPart changes itsPartNumber in Part when a new CarPart is created? – AlleyCat Feb 12 '17 at 17:29

0 Answers0