簡體   English   中英

如何讓一個類的向量從其他兩個類的向量中推回數據?

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

給定 A、B 和 C 類,我想知道如何將屬於 A 類和 B 類的向量的分量推回屬於 class C 的向量。

例如,在下面的代碼中,我有一個用於訂購比薩餅的簡單程序。 該程序允許用戶在系統中輸入新客戶和新的比薩餅類型,然后程序使用這些數據將客戶和比薩餅向量推回。

neworder() function 要求用戶輸入將構成訂單的客戶和披薩的 ID 號。 然后程序搜索這些 ID 號,如果匹配,它會要求用戶確認這些 ID 代表正確的客戶和披薩。

一旦用戶確認訂單正確,我想推回 Order 類的訂單向量,以包含與用戶提供的 ID 相對應的比薩餅向量和客戶向量的組件。

例如,如果用戶輸入 ID 0 0 並確認這是正確的選擇,我希望程序使用存儲在 x.pizzas[0] (0, "wheat", " amatriciana"、"provolone"、"squid")以及存儲在 y.customers[0] {0, "Bjarne", "Stroustrup"} 中的信息。 (請注意,ID 編號對應於矢量位置。)

最好的方法是什么? 一如既往地感謝您的幫助!

//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 的評論啟發我解決了這個問題,方法是使用每個訂單的 customerid 和 Pizzaid 的(副本)而不是 Pizza 和 Customer 類本身來推回訂單向量。 然后可以使用訂單向量中的信息來重現來自比薩餅和顧客向量的信息。

我沒有將 Pizzas 的 int Pizzaid 和 Customer 的 int customerid 包含為 Order class 的成員,而是復制了它們。 我想會有一種方法可以使用原始整數(如果是這樣,請告訴我)。

這是修改后的代碼,還有一些額外的注釋:

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";
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM