queue implementation using linked list in cpp

#include <iostream>

// Node structure for the linked list
template <typename T>
struct Node {
    T data;
    Node* next;

    Node(T val) : data(val), next(nullptr) {}
};

// Queue class using linked list
template <typename T>
class Queue {
private:
    Node<T>* front;
    Node<T>* rear;

public:
    // Constructor
    Queue() : front(nullptr), rear(nullptr) {}

    // Destructor
    ~Queue() {
        while (!isEmpty()) {
            dequeue();
        }
    }

    // Check if the queue is empty
    bool isEmpty() const {
        return front == nullptr;
    }

    // Enqueue a new element at the rear of the queue
    void enqueue(T val) {
        Node<T>* newNode = new Node<T>(val);
        if (isEmpty()) {
            front = rear = newNode;
        } else {
            rear->next = newNode;
            rear = newNode;
        }
    }

    // Dequeue the front element from the queue
    void dequeue() {
        if (!isEmpty()) {
            Node<T>* temp = front;
            front = front->next;
            delete temp;
            if (front == nullptr) {
                rear = nullptr;
            }
        }
    }

    // Get the front element of the queue without removing it
    T getFront() const {
        if (!isEmpty()) {
            return front->data;
        } else {
            // Handle empty queue case (assuming T is default-constructible)
            return T();
        }
    }
};

int main() {
    Queue<int> myQueue;

    myQueue.enqueue(10);
    myQueue.enqueue(20);
    myQueue.enqueue(30);

    std::cout << "Front element: " << myQueue.getFront() << std::endl;

    myQueue.dequeue();

    std::cout << "Front element after dequeue: " << myQueue.getFront() << std::endl;

    return 0;
}