Переменная класса недоступна из метода класса - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь реализовать циклическую очередь.

Я объявил размер очереди в заголовочном файле, и я инициировал свою очередь, используя переменную размера через конструктор.

Вот queue.h и queue.cpp файлы.

class Queue
{
   public:
   int size;
   int front, rear;
   int A[];

   Queue(int size);
   bool isEmpty();
   void enqueue(int n);
   int dequeue();
   int Peek();
   void Display();
   int sizeQ();
};

Вот queue.cpp

Queue::Queue(int size)
{
   int A[size];
   front = rear = -1;
}

bool Queue::isEmpty(){
if((front == -1)  && (rear == -1))
    return true;
else
    return false;
}


void Queue::Display(){
if(isEmpty()){
    cout << "Its empty! Nothing to display"<<endl;
}else{
    for(int i=0; i<sizeQ(); i++){
        cout << A[i] << endl;
    }
}
    cout <<endl;
}

Вот мой основной

int main()
{

   Queue q1(10);
   q1.enqueue(20);
   q1.Display();
   return 0;
}

Проблема: цикл внутри функции отображения не видит переменную размера, хотя я создал объект, используя размер внутри основного. Когда я отлаживал программу, я увидел, что размер равен 0, поэтому цикл for никогда не запускается.

То, что я пытался

 int Queue::sizeQ(){
   return size;
}

Я пытался вернуть размер с помощью метода;Однако не повезло. Что я должен сделать, чтобы получить доступ к переменной размера?

Ответы [ 3 ]

2 голосов
/ 14 октября 2019

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

Если вы хотите установить размер массива во время выполнения, он должен быть объявлен в куче. Для этого вы должны изменить объявление массива A следующим образом в заголовке:

int *A;

Затем в конструкторе вы можете выделить массив в куче:

Queue::Queue(int iSize): 
    size(iSize), front(-1), rear(-1)
{
   A = new int[size];
}

Примечание. список инициализаторов инициализирует размер переменных-членов, спереди и сзади.

Вы также должны освободить свой массив. Для этого добавьте деструктор в очередь классов и сделайте следующее:

Queue::~Queue()
{
   delete [] A;
}

Это освободит память, используемую A.

0 голосов
/ 14 октября 2019

Начать размер внутри конструктора, как показано ниже:

Queue::Queue(int nSize) //changed name of parameter to nSize to remove confusion
{
   int A[size];
   front = rear = -1;
   size = nSize; // Initialize passed param to member variable of class
}   
0 голосов
/ 14 октября 2019
Queue::Queue(int size)
{
   int A[size];
   front = rear = -1;
}

Вы никогда не инициализируете this->size здесь. Следовательно, sizeQ() возвращает неинициализированное значение size члена.

Добавление this->size = size; внутри конструктора.

РЕДАКТИРОВАТЬ: int A[size] не делает то, что вы думаете, что он делает. Он создает локальный массив и не имеет ничего общего с членом A. Обратитесь к ответу @jignatius, чтобы узнать, как это исправить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...