#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
inclass Calculate
.
Ответ №1:
Просто происходит то, что класс Queue
не виден классу Calculate
, так как компилятор (грубо говоря) читает и компилирует код сверху вниз. Таким образом, компилятор не знает о существовании класса с именем Queue
, пока он анализирует содержимое класса Calculate
.
Есть два способа заставить это работать:
- Поместите объявления классов в начало всех определений классов. Объявление класса выглядит следующим образом:
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
- Создайте файл заголовка со всеми такими объявлениями классов в нем, а затем включите этот файл заголовка. А затем создайте
.cpp
файл со всеми определениями функций в нем. При компиляции программы свяжите оба объектных файла (рекомендуемый вариант, так как он менее загроможден и легко масштабируется).
Кроме того, это не связано с проблемой здесь, но в идеале вы должны явно указать тип возвращаемого main
значения следующим образом
int main()
Этот код может даже не компилироваться в соответствии с более новыми стандартами C из-за того, что явно не упоминается возвращаемый тип main
.
Кроме того, вам не нужно использовать точку с запятой ( ;
) после определений функций.
Наконец, правильно отформатируйте код (в частности, не используйте несогласованные отступы).