простая система начисления заработной платы с использованием связанного списка C ++ - PullRequest
0 голосов
/ 03 февраля 2020

Я просто создаю систему начисления заработной платы, в которой есть имя сотрудника и рабочее время для этого сотрудника. Предполагается, что данные будут храниться в структуре данных связанного списка, но я не могу связать связанный список с объектом сотрудник класса, я попытался создать связанный список выплат (например, empList) в качестве члена stati c, чтобы все объекты класса могли использовать один и тот же объект списка, и данные можно было сохранить, но как только я скомпилировал свой код, я получил ошибка «неопределенная ссылка на employee :: empList» в строке 130, которая является последней строкой конструктора, та же ошибка в строке 150, которая является функцией печати платежной ведомости. Где бы я ни пытался вызвать функцию любого класса payRollLinkedList в employee класс, это дает ошибку. Суть в том, что все, что я хочу, это чтобы данные хранились в дважды связанном списке сотрудников, и я не могу получить доступ к списку.

    #include <iostream>
    using namespace std;
    class payRollLinkedList;
    class node
    {
    private:
        node* previousPointer;
        string name;
        int hoursWorked;
    node* nextPointer;
    friend class payRollLinkedList;
    public:
        explicit node(const string argName, const int argHoursWorked)
        : previousPointer{nullptr}, name{argName}, hoursWorked{argHoursWorked}, nextPointer{nullptr}
        {}
    };
    class payRollLinkedList
    {
    private:
        node* headPointer{nullptr};
        node* tailPointer{nullptr};
        node* getNewNode(const string argName, const int argHoursWorked)
        {
            return new node(argName, argHoursWorked);
        }
    public:
        void addAtBack(const string argName, const int argHoursWorked)
        {
            node* newNode{getNewNode(argName, argHoursWorked)};
            if(isEmpty())
            {
                headPointer = tailPointer = *newNode;
            }
            else
            {
                tailPointer->nextPointer = newNode;
                newNode->previousPointer = tailPointer;
                tailPointer = newNode;
                newNode = nullptr;
                delete newNode;
            }
        }
        bool deleteNode(string argName)
        {
            node* currentPointer{headPointer};
            if(isEmpty())
            {
                cout <<"the list is already empty\n";
                return false;
            }
            else
            {
                while(currentPointer != nullptr)
                {
                    if(currentPointer->name == argName)
                    {
                        if(currentPointer == headPointer)
                        {
                            node* tempPointer{headPointer};
                            headPointer = headPointer->nextPointer;
                            tempPointer->nextPointer = nullptr;
                            headPointer->previousPointer = nullptr;
                            delete tempPointer;
                            break;
                        }
                        if(currentPointer == tailPointer)
                        {
                            node*tempPointer{tailPointer};
                            tailPointer = tailPointer->previousPointer;
                            tempPointer->previousPointer = nullptr;
                            tailPointer->nextPointer = nullptr;
                            delete tempPointer;
                            break;
                        }
                        node* tempPointer{currentPointer};
                        node* nextPtr{tempPointer->nextPointer};
                        currentPointer = currentPointer->previousPointer;
                        currentPointer->nextPointer = nextPtr;
                        nextPtr->previousPointer = currentPointer;
                        tempPointer->nextPointer = nullptr;
                        tempPointer->previousPointer = nullptr;
                        currentPointer = nullptr;
                        nextPtr = nullptr;
                        delete tempPointer;
                        delete currentPointer;
                        delete nextPtr;
                    }
                    else
                        currentPointer = currentPointer->nextPointer;
                }
                return true;
            }
        }
        void print()
        {
            if(isEmpty())
            {
                cout <<"nothing to show\n";
                return;
            }
            else
            {
                node* currentPointer{headPointer};
                while(currentPointer != nullptr)
                {
                    cout <<currentPointer->name <<"\t";
                    currentPointer = currentPointer->nextPointer;
                }
            }
        }
        bool isEmpty()
        {
            return headPointer == nullptr? true : false;
        }
    };
    class employee
    {
    private:
        string name;
        int hoursWorked;
        static payRollLinkedList empList;
    public:
        employee()
        : name{""}, hoursWorked{0}
        {}
        employee(string argName, int argHoursWorked)
        {
            name = argName;
            hoursWorked = argHoursWorked;
            empList.addAtBack(name, hoursWorked);
        }
        void printPayRoll()
        {
            empList.print();
        }
    };
    int main()
    {
        employee emp("usman", 12);
        employee emp1("ali", 12);
        emp.printPayRoll();
    }

1 Ответ

0 голосов
/ 04 февраля 2020

https://en.cppreference.com/w/cpp/language/static

Вам необходимо определить stati c член класса в глобальной области видимости (вне класса). Я предлагаю вам разбить ваш код .h и. cpp файлов и определить член в. cpp файле.

payRollLinkedList employee::empList;
...