简体   繁体   中英

How can I get one class's vector to push back data from vectors in two other classes?

Given classes A, B, and C, I would like to know how I can push back components of vectors belonging to classes A and B into one vector belonging to class C.

For example, in the following code, I have a simple program for ordering pizzas. The program allows the user to enter new customers and new pizza types into the system, after which the program pushes back the customers and pizzas vectors with this data.

The neworder() function asks the user to enter the ID numbers of the customer and pizza that will comprise the order. The program then searches for these ID numbers, and if there's a match, it asks the user to confirm that these IDs represent the correct customer and pizza.

Once the user confirms that the order is correct, I would like to push back the Order class's orders vector to include the components of the pizzas vector and the customers vector that correspond to the IDs the user gave.

For example, if the user enters the IDs 0 0 and confirms that this is the right selection, I would like the program to push_back the orders vector with both the information stored at x.pizzas[0] (0, "wheat", "amatriciana", "provolone", "squid") and the information stored at y.customers[0] {0, "Bjarne", "Stroustrup"}. (Note that the ID numbers correspond to the vector positions.)

What would be the best way to do this? Thank you as always for your help!

//Test to see how I can get a vector in one class to store elements from vectors from two other classes

using namespace std;
#include <iostream>
#include <vector>

class Pizza
{
public:
    string crust;
    string sauce;
    //Mmm... string cheese
    string cheese;
    string topping;
    int pizzaid;
    vector<Pizza> pizzas;
    void addtomenu();

    Pizza(int a, string b, string c, string d, string e)
        : pizzaid{a}, crust{b}, sauce{c}, cheese{d}, topping{e} {}
};

class Customer
{
public:
    string firstname;
    string lastname;
    int customerid;
    vector<Customer> customers;
    void addcustomer();
    Customer(int a, string b, string c)
        : customerid{a}, firstname{b}, lastname{c} {}
};

class Order
{
public:
    Pizza orderedpizza;
    Customer customerordering;
    int orderid;
    vector<Order> orders;
    void neworder();
    void data();
    Order(Pizza a, Customer b)
        : orderedpizza{a}, customerordering{b} {}
};

//I added in these placeholder objects so that I could run functions/push back vectors that belong to these functions' classes. I'm not sure whether there is a more sophisticated way to do this.
//I used negative integers just in case positive ones would interfere with actual pizza/customer IDs.
Pizza x{-1, " ", " ", " ", " "};
Customer y{-1, " ", " "};
Order z{x, y};

void Pizza::addtomenu()
{
    cout << "Please enter the crust, sauce, cheese, and topping that this pizza will have, all separated by spaces.\n";
    cin >> crust >> sauce >> cheese >> topping;
    pizzaid = pizzas.size();
    x.pizzas.push_back(Pizza{pizzaid, crust, sauce, cheese, topping});
    cout << "The pizza has been added.\n";
}

void Customer::addcustomer()
{
    cout << "Please enter the first and last name of the customer, separated by spaces.\n";
    cin >> firstname >> lastname;
    customerid = customers.size();
    y.customers.push_back(Customer{customerid, firstname, lastname});
    cout << "The customer has been added.\n";
}

void Order::neworder()
{
    int tempcustomerid;
    int temppizzaid;
    bool trueflag1 = 0;
    bool trueflag2 = 0;
    string entry;
    cout << "Please enter the customer's ID, followed by the ID of the pizza being ordered. Separate the two with spaces.\n";
    if (cin >> tempcustomerid >> temppizzaid)
    {
        for (int d = 0; d < y.customers.size(); d++)
        {
            if (tempcustomerid == y.customers[d].customerid)
            {
                trueflag1 = 1;
                tempcustomerid = d;
            }
        }

        if (trueflag1 == 0)
        {
            cin.clear();
            cin.ignore(1000, '\n');
            cout << "That ID does not match any customer in the system.\n";
            return;
        }

        for (int e = 0; e < x.pizzas.size(); e++)
        {
            if (temppizzaid == x.pizzas[e].pizzaid)
            {
                cin.clear();
                cin.ignore(1000, '\n');
                trueflag2 = 1;
                temppizzaid = e;
            }
        }

        if (trueflag2 == 0)
        {
            cout << "That ID does not match any pizza in the system.\n";
            return;
        }

        {
            cout << "The following customer: " << y.customers[tempcustomerid].customerid << " " << y.customers[tempcustomerid].firstname << " " << y.customers[tempcustomerid].lastname << " ";
            cout << "will be ordering the following pizza: " << x.pizzas[temppizzaid].pizzaid << " " << x.pizzas[temppizzaid].crust << " " << x.pizzas[temppizzaid].sauce << " " << x.pizzas[temppizzaid].cheese << " " << x.pizzas[temppizzaid].topping << ".\n";
            cout << "Is that correct? If yes, press 1; if no, press 0.\n";
            cin >> entry;
            if (entry == "1")
            {
                //Here, I would like to push back my orders vector to include the contents of y.customers[tempcustomerid] and y.pizzas[temppizaid]. What would be the best way to do this?

                cout << "The order has been placed.\n";
            }
            else
            {
                cout << "Order canceled.\n";
                return;
            }
        }
    }
    else
    {
        cin.clear();
        cin.ignore(10000, '\n');
        cout << "Please enter your input in integer form.\n";
    }
}

void Order::data()
{
    cout << "Pizzas entered into system so far:\n";
    for (int d = 0; d < x.pizzas.size(); d++)
    {
        cout << x.pizzas[d].pizzaid << " " << x.pizzas[d].crust << " " << x.pizzas[d].sauce << " " << x.pizzas[d].cheese << " " << x.pizzas[d].topping << "\n";
    }

    cout << "Customers entered into system so far:\n";
    for (int d = 0; d < y.customers.size(); d++)
    {
        cout << y.customers[d].customerid << " " << y.customers[d].firstname << " " << y.customers[d].lastname << "\n";
    }
}

int main()

{
    //These two push_back functions are added to create test items for debugging purposes.
    x.pizzas.push_back(Pizza{0, "wheat", "amatriciana", "provolone", "squid"});
    y.customers.push_back(Customer{0, "Bjarne", "Stroustrup"});

    string entry;
    while (true)
    {
        cout << "Welcome to the Pizza Orderer 5000. To enter a new customer, enter addcustomer. To enter a new pizza to the menu, enter addtomenu. To enter a new order, enter order. To list all data in the system, enter data. To quit, enter quit.\n";
        cin >> entry;
        if (entry == "addcustomer")
            y.addcustomer();
        else if (entry == "addtomenu")
            x.addtomenu();
        else if (entry == "order")
            z.neworder();
        else if (entry == "data")
            z.data();
        else if (entry == "quit")
            break;
        else
        {
            cin.clear();
            cin.ignore(10000, '\n');
            cout << "I'm sorry, that input was not recognized. Please try again.\n";
        }
    }
}

PaulMckenzie's comment inspired me to solve this problem by pushing back the orders vector with (copies of) the customerid and pizzaid for each order, and not with the Pizza and Customer classes themselves. The information in the orders vector can then be used to reproduce information from the pizzas and customers vectors.

Instead of including Pizzas's int pizzaid and Customer's int customerid as members of the Order class, I made copies of them. I imagine that there would be a way to use the original ints instead (and if so, please let me know).

Here is the revised code, with some additional comments:

using namespace std;
#include <iostream>
#include <vector>

class Pizza
{
public:
    string crust;
    string sauce;
    //Mmm... string cheese
    string cheese;
    string topping;
    int pizzaid;
    vector<Pizza> pizzas;
    void addtomenu();

    Pizza(int a, string b, string c, string d, string e)
        : pizzaid{a}, crust{b}, sauce{c}, cheese{d}, topping{e} {}
};

class Customer
{
public:
    string firstname;
    string lastname;
    int customerid;
    vector<Customer> customers;
    void addcustomer();
    Customer(int a, string b, string c)
        : customerid{a}, firstname{b}, lastname{c} {}
};

class Order
{
public:
    int orderedpizzaid;
    int orderingcustomerid;
    int orderid;
    vector<Order> orders;
    void neworder();
    void data();
    Order (int a, int b, int c) 
    : orderid{a}, orderingcustomerid{b}, orderedpizzaid{c} {}
};

//I added in these placeholder objects so that I could run functions/push back vectors that belong to these functions' classes. I'm not sure whether there is a more sophisticated way to do this.
//I used negative integers just in case positive ones would interfere with actual pizza/customer IDs.
Pizza x{-1, " ", " ", " ", " "};
Customer y{-1, " ", " "};
Order z{-1, -1, -1};

void Pizza::addtomenu()
{
    cout << "Please enter the crust, sauce, cheese, and topping that this pizza will have, all separated by spaces.\n";
    cin >> crust >> sauce >> cheese >> topping;
    pizzaid = pizzas.size();
    x.pizzas.push_back(Pizza{pizzaid, crust, sauce, cheese, topping});
    cout << "The pizza has been added.\n";
}

void Customer::addcustomer()
{
    cout << "Please enter the first and last name of the customer, separated by spaces.\n";
    cin >> firstname >> lastname;
    customerid = customers.size();
    y.customers.push_back(Customer{customerid, firstname, lastname});
    cout << "The customer has been added.\n";
}

void Order::neworder()
{
    int orderid;
    int orderedpizzaid;
    int orderingcustomerid;
    bool trueflag1 = 0;
    bool trueflag2 = 0;
    string entry;
    cout << "Please enter the customer's ID, followed by the ID of the pizza being ordered. Separate the two with spaces.\n";
    if (cin >> orderingcustomerid >> orderedpizzaid)
    {
        for (int d = 0; d < y.customers.size(); d++)
        {
            if (orderingcustomerid == y.customers[d].customerid)
            {
                trueflag1 = 1;
                orderingcustomerid = d;
            }
        }

        if (trueflag1 == 0)
        {
            cin.clear();
            cin.ignore(1000, '\n');
            cout << "That ID does not match any customer in the system.\n";
            return;
        }

        for (int e = 0; e < x.pizzas.size(); e++)
        {
            if (orderedpizzaid == x.pizzas[e].pizzaid)
            {
                cin.clear();
                cin.ignore(1000, '\n');
                trueflag2 = 1;
                orderedpizzaid = e;
            }
        }

        if (trueflag2 == 0)
        {
            cout << "That ID does not match any pizza in the system.\n";
            return;
        }

        {
            cout << "The following customer: " << y.customers[orderingcustomerid].customerid << " " << y.customers[orderingcustomerid].firstname << " " << y.customers[orderingcustomerid].lastname << " ";
            cout << "will be ordering the following pizza: " << x.pizzas[orderedpizzaid].pizzaid << " " << x.pizzas[orderedpizzaid].crust << " " << x.pizzas[orderedpizzaid].sauce << " " << x.pizzas[orderedpizzaid].cheese << " " << x.pizzas[orderedpizzaid].topping << ".\n";
            cout << "Is that correct? If yes, press 1; if no, press 0.\n";
            cin >> entry;
            if (entry == "1")
            {orderid = orders.size();
            //The orders ID is pushed back with only the order ID and (copies of)
//the pizza and customer IDs. However, this information will be sufficient to 
//reproduce all of the customer and pizza information that corresponds to the 
//customer and pizza IDs, as shown in the data function. 
               z.orders.push_back(Order{orderid, orderingcustomerid, orderedpizzaid});
                cout << "The order has been placed.\n";
            }
            else
            {
                cout << "Order canceled.\n";
                return;
            }
        }
    }
    else
    {
        cin.clear();
        cin.ignore(10000, '\n');
        cout << "Please enter your input in integer form.\n";
    }
}

void Order::data()
{
    cout << "Pizzas entered into system so far:\n";
    for (int d = 0; d < x.pizzas.size(); d++)
    {
        cout << x.pizzas[d].pizzaid << " " << x.pizzas[d].crust << " " << x.pizzas[d].sauce << " " << x.pizzas[d].cheese << " " << x.pizzas[d].topping << "\n";
    }

    cout << "Customers entered into system so far:\n";
    for (int d = 0; d < y.customers.size(); d++)
    {
        cout << y.customers[d].customerid << " " << y.customers[d].firstname << " " << y.customers[d].lastname << "\n";
    }

cout << "Orders entered into system so far:\n";
for (int d = 0; d < z.orders.size(); d++)
    {
        //Each order is given an order ID that equals that order's position in the 
//orders vector. The orders vector stores both each order's ID and copies of the IDs
//of the pizza and customer that were included in that order.
        //Therefore, for each order in the orders vector, the following code: (1) prints
// the corresponding order id; (2) prints information from the customers vector for the 
//customer whose customerid matches the orders vector's orderingcustomerid; and (3) prints
// information from the pizzas vector for the pizza whose pizzaid matches the orders 
//vector's orderingpizzaid.
        cout << "Order ID: " << z.orders[d].orderid; 
        cout << " Customer information: " <<  y.customers[z.orders[d].orderingcustomerid].customerid << " " << y.customers[z.orders[d].orderingcustomerid].firstname << " " << y.customers[z.orders[d].orderingcustomerid].lastname;
        cout << " Pizza information: " << x.pizzas[z.orders[d].orderedpizzaid].pizzaid << " " << x.pizzas[z.orders[d].orderedpizzaid].crust << " " << x.pizzas[z.orders[d].orderedpizzaid].sauce << " " << x.pizzas[z.orders[d].orderedpizzaid].cheese << " " << x.pizzas[z.orders[d].orderedpizzaid].topping << "\n";
    }

}

int main()

{
    //These two push_back functions are added to create test items for debugging purposes.
    x.pizzas.push_back(Pizza{0, "wheat", "amatriciana", "provolone", "squid"});
    y.customers.push_back(Customer{0, "Bjarne", "Stroustrup"});

    string entry;
    while (true)
    {
        cout << "Welcome to the Pizza Orderer 5000. To enter a new customer, enter addcustomer. To enter a new pizza to the menu, enter addtomenu. To enter a new order, enter order. To list all data in the system, enter data. To quit, enter quit.\n";
        cin >> entry;
        if (entry == "addcustomer")
            y.addcustomer();
        else if (entry == "addtomenu")
            x.addtomenu();
        else if (entry == "order")
            z.neworder();
        else if (entry == "data")
            z.data();
        else if (entry == "quit")
            break;
        else
        {
            cin.clear();
            cin.ignore(10000, '\n');
            cout << "I'm sorry, that input was not recognized. Please try again.\n";
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM