#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 Да, это была ошибка, хорошо замеченная. Я также исправил это сам.