Как добавить объект дочерних классов в вектор базового класса - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть такие классы: Customer, Order, OrderByPhone и OrderByInternet.Класс Order является абстрактным и имеет такие дочерние классы, как OrderByPhone и OrderByInternet.У меня есть вектор объектов Order внутри класса Customer (поскольку клиент делает заказ (byPhone или byInternet). Я хочу, чтобы Клиент мог добавить либо объект OrderByPhone, либо объект OrderByInternet в вектор объектов Order.

НижеВот какой-то код:

vector<Order*> listOfOrder;

void customer::addOrder(Order *orderObj)
{
    listOfOrder.push_back(orderObj);
} // these are inside Customer class

В классе контроллера есть список клиентов и функция создания заказа, такая как:

void createOrder(vector <customer> &listCustomer) {
    double tax;
    double total;
    int accntNumCheck;
    int orderTypeOption;
    string url;
    string clerkName;
    int phoneNum;
    //order orderObj; cannot create an object of order because its an abstract class but you can create a pointer of orders
    Order *orderObj;
    vector<Order *> listOfOrder;
    bool found = false;
    customer *foundCust; //it is a pointer coz we need to add the order into the original customer;

    cout << "Enter Customer Account No: " << flush;
    cin >> accntNumCheck;

    for(int unsigned i = 0; i < listCustomer.size(); i++){
        if(listCustomer[i].getAccntNum() == accntNumCheck){
            cout<< listCustomer[i].getAccntName();
            found = true;
            foundCust = &listCustomer[i];
        }
    }
    if (found) {
        cout << "1. Order By Phone " << endl;
        cout << "2. Order By Internet" << endl;
        cout << "Your Option >>> " << flush;
        cin >> orderTypeOption;

        switch (orderTypeOption) {
        case 1:
            cout << "Enter clerk name: " << flush;
            cin >> clerkName;
            cout << "Enter Phone Number: " << flush;
            cin >> phoneNum;
            cout << "Enter Tax: RM" << flush;
            cin >> tax;
            cout << "Enter Total: RM" << flush;
            cin >> total;
            orderObj = new orderByPhone(tax, total, clerkName, phoneNum);
            //(iterCust)->addOrder(orderObj); this is incorrect but idk why
            foundCust->addOrder(orderObj);
            break;
        case 2:
            cout << "Enter URL: " << flush;
            cin >> url;
            cout << "Enter Tax: RM" << flush;
            cin >> tax;
            cout << "Enter Total: RM" << flush;
            cin >> total;
            orderObj = new orderByInternet(tax, total, url);
            //(iterCust)->addOrder(orderObj); this is incorrect but idk why
            foundCust->addOrder(orderObj);
            break;
        }
        delete foundCust; //MUST DELETE THE POINTER AFTER WE USED IT
    }
    else{
        cout << "Customer not found!";
    }
}

Это главное в контроллере:

int main()
{
    vector <customer> listCustomer;
    int option;
    do
    {
        option=menu();
        switch (option)
        {
        case 1: addCustomer(listCustomer);
                break;
        case 2: createOrder(listCustomer);
                break;
        case 3: print(listCustomer);
                break;
        default: cout<<"Bye"<<endl;
        }
    }while (option <=3);

    listCustomer.clear();
    return 0;
}

У меня проблема с печатью, и я уверен, что есть проблема в том, как я добавляю дочерние объекты в вектор базового класса. Извините, что не предоставил весь код, так как я думал, что это будет слишком много, и я загрузилтолько необходимый код. PS -> Мне удалось добавить клиента и распечатать (для проверки). В основном мне нужна помощь с добавлением Заказа (первый код) в классе Customer. Спасибо, что нашли время прочитать все это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...