Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Printing a string from a private array using overloaded subscript operator

I’m having trouble trying to figure out how to print a string from a private array using the square bracket overloaded operator. I’ve tried looking for a solution but I can’t figure it out. The closest I got was using cout << &del[i]; and that at least printed some memory address or something. How do I use the overloaded subscript operator to return the strings that I need? passing in i should return the orderItems array at i, but I just can’t figure out how to call it.

edit I’m stuck on the dequeue method of the OrderQueue class, and the overloaded operator is in the OrderNode struct.

#include <iostream>

using namespace std;

struct OrderNode {
private:
    string orderItems[5] = { "", "", "", "", "" };

public:
    double subTotal;
    int itemCount;

    OrderNode* next;

    OrderNode(OrderNode* n = NULL) { next = n; subTotal = 0.0; itemCount = 0;}

    void addItem(string item) {
        if (itemCount < 5) {
            orderItems[itemCount] = item;
            itemCount++;
        }
        else {
            throw string("Order full. Please begin another.");
        }
    }
    string operator[](int index) {
        if (index < 0 || index >= itemCount)
            throw string("Index out of range");
        else
            return orderItems[index];
    }
};

void menu() {
    cout << "Select an item:\n";
    cout << "1) Coffee     -    $2.99\n";
    cout << "2) Tea        -    $2.59\n";
    cout << "3) Soft Drink -    $1.49\n";
    cout << "4) Water      -    $0.99\n";
    cout << "5) No Other Items\n";
}

class OrderQueue {
private:
    OrderNode* front;
    OrderNode* rear;
public:
    OrderQueue() {
        front = NULL;
        rear = NULL;
    }
    void enqueue() {
        int choice{ 0 };
        OrderNode* tmp = new OrderNode;
        if (rear == NULL) {
            front = tmp;
            rear = tmp;
        }
        while (tmp->itemCount < 5 && choice != 5) {
            menu();
            cin >> choice;
            if (choice == 1) {
                tmp->addItem("Coffee");
                tmp->subTotal += 2.99;
            }
            else if (choice == 2) {
                tmp->addItem("Tea");
                tmp->subTotal += 2.59;
            }
            else if (choice == 3) {
                tmp->addItem("Soft Drink");
                tmp->subTotal += 1.49;
            }
            else if (choice == 4) {
                tmp->addItem("Water");
                tmp->subTotal += 0.99;
            }
            else
                break;
        }
        rear->next = tmp;
        rear = tmp;
        cout << "\n\nOrder placed" << endl;
    }
    void dequeue() {
        if (front == NULL) {
            cout << "No pending order\n";
            return;
        }
        OrderNode* del = front;
        front = front->next;
        cout << "This order consists of the following items:\n";
        for (int i = 0; i < del->itemCount; i++) {
            cout << "In Loop index: " << i << endl;
            &del[i];
        }
        delete del;
        }
    void traverse();
};

void displayMenu() {
    cout << "COVID Cafe Drive-Thru Order Manager" << endl;
    cout << "1) Take an Order" << endl;
    cout << "2) Close out an Order" << endl;
    cout << "3) List all pending Orders" << endl;
    cout << "4) Go home and self-isolate" << endl;
}

int main() {
    OrderQueue* test = new OrderQueue;

    int c{};
    do {
        displayMenu();
        while (!(cin >> c)) {
            cout << "Error, please select a valid choice, use enter 4 to exit the program\n";
            displayMenu();
            cin.clear();
            cin.ignore();
        }
        switch (c) {
        case 1://enqueue order
            test->enqueue();
            break;
        case 2://dequeue order
            test->dequeue();
            break;
        case 3://traverse current orders in queue
            break;
        case 4://quit the program
            break;
        default:
            break;
        }
    } while (c != 4);

    return 0;
}

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

&del[i];

The shown code defines the [] operator OrderNode objects .

del is not an OrderNode object. It is a pointer to an OrderNode object. As you already know, if you have a pointer to an object, the unary * operator dereferences the pointer and gives you a reference to the pointed-to object.

Therefore, given the priority and associativity of * and [] operators, the correct syntax must, therefore, be:

(*del)[i]

Of course, you’ll have to do something with the returned std::string. This’ll get you the std::string that’s returned from the [] operator. and it will be up to you to figure out what to do with it, like:

std::cout << (*del)[i]
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading