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

#c #pointers #queue #operator-overloading

#c #указатели #очередь #оператор-перегрузка

Вопрос:

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

 #include <iostream>
using namespace std; 

class Queue { 
    int size; 
    int* queue; 
    
    public:
    Queue() { 
        size = 0;
        queue = new int[100];
    }
    //adds an item to  the queue`enter code here`
    void add(int data) { 
        queue[size] = data; 
        size  ;
    }
    //removes an item from the queue
    void remove() { 
        if (size == 0) { 
            cout << "Queue is empty"<<endl; 
            return; 
        } 
        else { 
            for (int i = 0; i < size - 1; i  ) { 
                queue[i] = queue[i   1]; 
            } 
            size--; 
        } 
    } 
    // a function to display the queue
    void print() { 
        if (size == 0) { 
            cout << "Queue is empty"<<endl; 
            return; 
        } 
        for (int i = 0; i < size; i  ) { 
            cout<<queue[i]<<" <- ";
        } 
        cout << endl;
    }
 

Это функция для добавления очередей. Он не возвращает ошибку. Но всякий раз, когда я пытался добавить очереди, она всегда возвращала пустую очередь. В чем может быть проблема

   Queue operator (Queue amp;obj){
      Queue res;
      res.queue = *queue   obj.queue;
      return res;
  }
    
}; 
 

Здесь запускается основная функция.

  int main() { 
    Queue q1; 
    q1.add(42); q1.add(2); q1.add(8);  q1.add(1);
    Queue q2;
    q2.add(3); q2.add(66); q2.add(128);  q2.add(5);
    Queue q3 = q1 q2;
    q3.print();

    return 0; 
} 
 

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

1. *queue obj.queue Это не объединяет два целочисленных массива, как вы, кажется, полагаете. Это принимает указатель obj.queue , увеличивает его на целое *queue число (по-видимому, первый элемент в очереди) и возвращает результирующий указатель. В принципе, это не имеет смысла — вы просто случайно наткнулись на бессмысленное выражение, которое просто компилируется.

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

3. о, спасибо… Я новичок, и я только начал изучать указатели и распределение памяти. Может быть, мне нужно узнать больше об этой теме

4. Сэр, не могли бы вы сказать мне, как я могу добавить две очереди, используя перегрузку оператора

Ответ №1:

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

 Queue operator (Queue amp;obj){
  Queue res;
  res.size = size   obj.size; // work out the new queues size
  res.queue = new int[100]; // allocate memory for new queue
  for (int i = 0; i < size;   i) // copy from first queue to new queue
      res.queue[i] = queue[i];
  for (int i = 0; i < obj.size;   i) // copy from second queue to new queue
      res.queue[size   i] = obj.queue[i];
  return res;
}
 

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

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

1. Это сработало!! Я просто заменил queue[i]; на obj. очередь [i] в 8-й строке кода, который вы только что опубликовали. Это имело такой смысл. Я просто увеличивал значение по одному и тому же указателю. Большое вам спасибо, сэр

2. @SandeshYadav Да, это была ошибка, хорошо замеченная. Я также исправил это сам.