C ++ LinkedList проблемы. Конфликт между типами данных? Нет подходящего конструктора? - PullRequest
0 голосов
/ 20 февраля 2020

, поэтому я пишу программу, которая получает строку ввода от пользователя и выполняет некоторые базовые c операции над ней, такие как getlength, get index, добавляет к другой строке и проверяет, соответствует ли она подстроке. Большая часть моего кода основана на примере кода моего профессора, я просто пишу дополнительные методы для выполнения операций, которые я перечислил ранее. Однако я получаю сообщение об ошибке от LinkedChar.h и Node.h, которое я неоднократно делал, но не мог найти решения. Я отмечу большие ОШИБКИ! слово в разделе комментариев в моем коде.

    #include <iomanip>
    #include "LinkedChar.h"


    // Function prototype
    bool isCreated(const LinkedChar<char>* charPtr);
    LinkedChar<char> toLinkedChar(const string &items);

    /************************************************************************
    *                                 main                                  *
    ************************************************************************/
    int main()
    {
        bool done = false; // A finish flag
        int choice; // Menu choice

        cout << " This program solves an ADT character string.  \n";

        LinkedChar<char>* charPtr = nullptr;
        string firstString;
        char aChar;

        while (!done)
        {
            // Display the menu and get the user's choice
            cout << "=========================================================\n"
                << "Operations\n\n";
            cout << setw(5) << "1. New the first string\n";
            cout << setw(5) << "2. Get the length from the first string\n";
            cout << setw(5) << "3. Find index of character in the first string\n";
            cout << setw(5) << "4. Append another string to the first string\n";
            cout << setw(5) << "5. Test if another string is submatch of the first string\n";
            cout << setw(5) << "6. Quit\n"
                <<"=========================================================\n\n";
            cout << "Enter your Choice (1-6): ";
            cin >> choice;
            cin.ignore();

            // Validate and process the menu choice
            if (choice == 1)
            {
                cout << "Please enter a string: ";
                getline(cin, firstString);

                charPtr = new LinkedChar<char>(firstString);
                cout << "The first string has been created. \n\n";
            }
            else if (choice == 6)
            {
                // Set the program is finished
                done = true;
            }
            else if (choice > 1 && choice < 6)
            {
                if (isCreated(charPtr))
                    // Execute the correct set of actions
                    switch (choice)
                    {
                        case 2:
                            cout << "The length of the first string \"" <<  charPtr->toString() << "\" is " << charPtr->length() << ".\n\n";
                            break;
                        case 3:
                            cout << "Please enter a character to find: ";
                            cin >> aChar;
                            cout << "The index of \"" << aChar << "\" is " << charPtr->index(aChar) << "\n\n";
                            break;
                        case 4:
                            cout << "Please enter another string to append: ";
                            getline(cin, firstString);
                            charPtr->append(toLinkedChar(firstString));
                            cout << "The string changes to \"" << charPtr->toString() << "\".\n\n";

                            break;
                        case 5:
                            cout << "Please enter another string to test: ";
                            getline(cin, firstString);
                            cout << "The string \"" << firstString << "\" is ";
                            if (!charPtr->submatch(toLinkedChar(firstString)))
                                cout << "not ";
                            cout << "submatch of the first string \"" << charPtr->toString() << "\".\n\n";
                            break;
                    }
            }
            else
            {
                cout << "The valid choices are 1 through 6.\n\n";
            }
        }

        return 0;
    }

    bool isCreated(const LinkedChar<char>* charPtr)
    {
        if (charPtr == nullptr)
        {
            std::cout << "Please choose 1 to create the first string before start!\n\n";
            return false;
        }
        else
        {
            return true;
        }
    }

    LinkedChar<char> toLinkedChar(const string &items)
    {
        return LinkedChar<char>(items);
    }

Node.h

        #ifndef NODE_H
        #define NODE_H

        template<class ItemType>
        class Node
        {
        private:
            ItemType item;
            Node<ItemType>* next; // Pointer to next node

        public:
            Node() {
                next = nullptr;
            }
            Node(const ItemType& anItem)
            {
                //  ----------- ERRORS ------------// 
                item(anItem);    //Called object type 'char' is not a function or function 
                                 //pointer
                next(nullptr);   //Called object type 'Node<char> *' is not a function or 
                                //function pointer

                                  /*This copy constructor is also exposed an error that I 
                                 could not understand. I think that I declare the item as a 
                                 template so later I could determine that datatype for item is 
                                either string or char*/  
                 // --------------------------------// 
            }
            Node(const ItemType& anItem, Node<ItemType>* nextNodePtr)
            {
                item(anItem);
                next(nextNodePtr);
            }

            void setItem(const ItemType& anItem)
            {
                item = anItem;
            }
            void setNext(Node<ItemType>* nextNodePtr)
            {
                next = nextNodePtr;
            }

            ItemType getItem()  const {
                return item;
            }
            Node<ItemType>* getNext() const {
                return next;
            } 
        }; // end Node
        #endif

LinkedChar.h

        // Created by 
        //
        #ifndef LINKEDCHAR_H
        #define LINKEDCHAR_H

        #include <iostream>
        #include <string>
        #include "Node.h"

        using namespace std;

        template<class ItemType>
        class LinkedChar
        {
        private:
            Node<ItemType>* headPtr;
            int itemCount;
        public:
            LinkedChar() {
                headPtr = nullptr;
                itemCount = 0;
            }
            LinkedChar(string items) {

                itemCount = int(items.size());

                headPtr = nullptr;

                for (int i = itemCount - 1; i >= 0; i--)
                {
                    if (headPtr == nullptr)
                    {
                        // Copy first node
                        headPtr = new Node<ItemType>();
                        headPtr->setItem(items[i]);
                    } else {
                        // Create a new node containing the next item
                        Node<ItemType>* newNodePtr = new Node<ItemType>(items[i]);
                        newNodePtr->setNext(headPtr);  // New node points to chain

                        headPtr = newNodePtr;          // New node is now first node
                    }
                }
            }
            virtual ~LinkedChar() {
                clear();
            }

            int length() {
                return itemCount;
            }
            int index(const ItemType& anItem) const {
                int index = 0;
                Node<ItemType>* curPtr = headPtr;

                while (curPtr != nullptr)
                {
                    if (anItem == curPtr->getItem())
                    {
                        return index;

                    } // end if
                    index++;
                    curPtr = curPtr->getNext();
                }
                return -1;
            }; // -1 if no match
            void append(const LinkedChar& lc) {
                  // -------------- ERRORS ------------------ //

                itemCount += lc.length(); // This is when I got the error guys, it says
                                          // " 'this' argument to member function 'length' has
                                          //type 'const LinkedChar<char>', but function is not
                                           marked const "
                 // ------------------------------------------//
                Node<ItemType>* newChainPtr = headPtr;
                while (newChainPtr != nullptr && newChainPtr->getNext() != nullptr)
                {
                    newChainPtr = newChainPtr->getNext();
                }

                Node<ItemType>* origChainPtr = lc.headPtr;
                while (origChainPtr != nullptr)
                {
                    // Get next item from original chain
                    ItemType nextItem = origChainPtr->getItem();

                    // Create a new node containing the next item

                   // ---------------- ERRORS -------------------- //

                    Node<ItemType>* newNodePtr = new Node<ItemType>(nextItem);
                                               ^^
                                               ||
                                               ||
                   // ERROR: The Error of no matching constructor for initialization of Node<Char>
                   //This happens to me alot previously, my solution is just put new Node(' ') 
                   //But in this case seem inappropriate
                   // ---------------------------------------------  //

                    // Link new node to end of new chain
                    newChainPtr->setNext(newNodePtr);

                    // Advance pointer to new last node
                    newChainPtr = newChainPtr->getNext();

                    // Advance original-chain pointer
                    origChainPtr = origChainPtr->getNext();
                }
                newChainPtr->setNext(nullptr);
            }
            bool submatch(const LinkedChar& lc) const {
                bool found = false;
                Node<ItemType>* curPtr = headPtr;
                Node<ItemType>* origChainPtr = lc.headPtr;

                ItemType anItem;

                while (origChainPtr != nullptr && curPtr != nullptr)
                {
                    anItem = origChainPtr->getItem();

                    while (curPtr != nullptr)
                    {
                        if (anItem == curPtr->getItem())
                        {
                            found = true;
                            curPtr = curPtr->getNext();
                            break;
                        }
                        else if (found)
                        {
                            found = false;
                            break;
                        }

                        curPtr = curPtr->getNext();
                    }
                    if (!found)
                        origChainPtr = lc.headPtr;
                    else
                        origChainPtr = origChainPtr->getNext();
                }

                return found && (origChainPtr == nullptr);
            }

            void clear() {
                Node<ItemType>* curPtr = headPtr;
                while (headPtr != nullptr)
                {
                    headPtr = headPtr->getNext();

                    // Return node to the system
                    curPtr->setNext(nullptr);
                    delete curPtr;

                    curPtr = headPtr;
                }

                itemCount = 0;
            }

            string toString() const {
                std::string aString;
                Node<ItemType>* curPtr = headPtr;

                while ((curPtr != nullptr))
                {
                    aString += (curPtr->getItem());
                    curPtr = curPtr->getNext();
                }

                return aString;
            }
        };

        //#include "LinkedChar.cpp"
        #endif //LINKEDCHAR_H

1 Ответ

1 голос
/ 20 февраля 2020

Вы получаете перегружены сообщениями об ошибках. Вы должны взять каждого по очереди, начиная с первого. Понять, что это говорит вам. Исправьте, перекомпилируйте, чтобы убедиться. И переходите к следующему.

Для начала:

  1. Make length() const

    int length() const {
    
  2. Изменить

    next(nullptr);
    

    до

    setNext(nullptr);
    
  3. Изменить

    item(anItem);
    

    на

    setItem(anItem);
    
...