Хранение строки в очереди с использованием отдельных определений классов, C

#c

Вопрос:

Я пытаюсь сохранить строковый ввод (математическое уравнение) в связанный список очередей. Чтобы добавить символ в очередь, мне нужно получить доступ к функции очереди «Enqueue( )» из отдельного класса: класса «Вычислить».

Я продолжаю получать сообщения об ошибках («Очередь»: необъявленный идентификатор») и («QueObj»: необъявленный идентификатор).

Мой код в основном выглядит так (удалено большинство несвязанных кодов):

 #include <iostream>
#include <stdlib.h> 
#include <string>

class Calculate                                     // Convert from string to node
{
    public:
        double Calc(string text)            
        {
            input = text;                           // math notation, user input sent from main()

/* error message here -> */ Queue queObj;       // Queue object created to access Queue functions
/* error message here -> */ queObj.Enqueue(text); // Enqueues the notation into a Queue
            };

        private:
            string input;                           // The input string for the math equation
    };

    class Queue 
    {
        public:
            void Enqueue(string queVal)             // Enqueue definitions 
            {
                // Enqueue instructions
            };
    
            void Dequeue()                          // Dequeue definitions
            {
                // Dequeue instructions
            };
    
            bool IsEmpty()                          // Queue size check 
            {   
                // Queue size check
            };
    
        private:
            Node *head = NULL;                      // Pointer for start of queue (set to NULL)
            Node *tail = NULL;                      // Pointer for end of queue (set to NULL)
            friend class Calculate;                 // Friend class allows Calculate to access Queue private data
    };

   int main()
    {
      string Eq1 = "1   2";                         // math equation 
      Calculate calcObj;                            // object to access calculate class functions and variables
      calcObj.Calc(Eq1);                            // stores the equation into calculate class
      
      return 0;
    }
 

Комментарии:

1.Переместитесь class Queue раньше class Calculate в файле, поэтому class Calculate знает, что class Queue будет, когда это Queue queObj произойдет (кроме того, вы Node объявили в другом месте…)

2. @DavidC.Rankin да, но в class queue нем он определен class calculate как класс друзей

3. Конечно, но это контролирует доступ участников и не помогает с экземпляром class Queue in class Calculate .

Ответ №1:

Просто происходит то, что класс Queue не виден классу Calculate , так как компилятор (грубо говоря) читает и компилирует код сверху вниз. Таким образом, компилятор не знает о существовании класса с именем Queue , пока он анализирует содержимое класса Calculate .

Есть два способа заставить это работать:

  1. Поместите объявления классов в начало всех определений классов. Объявление класса выглядит следующим образом:
 class Queue 
{
    public:
        void Enqueue(string queVal);             // Enqueue definitions 
        void Dequeue();                          // Dequeue definitions
        bool IsEmpty();                          // Queue size check 

    private:
        Node *head = NULL;                      // Pointer for start of queue (set to NULL)
        Node *tail = NULL;                      // Pointer for end of queue (set to NULL)
        friend class Calculate;                 // Friend class allows Calculate to access Queue private data
};
 

А затем в нижней части вы можете определить все функции следующим образом:

 void Queue::Enqueue(string queval)
{
    // Enqueue instructions
}
// rest of the functions
 
  1. Создайте файл заголовка со всеми такими объявлениями классов в нем, а затем включите этот файл заголовка. А затем создайте .cpp файл со всеми определениями функций в нем. При компиляции программы свяжите оба объектных файла (рекомендуемый вариант, так как он менее загроможден и легко масштабируется).

Кроме того, это не связано с проблемой здесь, но в идеале вы должны явно указать тип возвращаемого main значения следующим образом

 int main()
 

Этот код может даже не компилироваться в соответствии с более новыми стандартами C из-за того, что явно не упоминается возвращаемый тип main .

Кроме того, вам не нужно использовать точку с запятой ( ; ) после определений функций.

Наконец, правильно отформатируйте код (в частности, не используйте несогласованные отступы).