2016-11-17 4 views
0

Это код.Конструктор не вызывается в C++

#include<iostream> 
using namespace std; 

class Item{ 
    double itemPrice; 
    int qty; 
    public: 
    Item(){ 
     cout<<"Enter Item Price : "<<endl; 
     cin>>itemPrice; 
     cout<<"Enter QTY : " <<endl; 
     cin>>qty; 
    } 
    double getItemTotal(){ 
     return itemPrice*qty; 
    } 
    }; 

    class Order{ 
     int index; 
     int orderId; 
     double orderValue; 
     Item items[20]; 
    public: 
     Order(){ 
      index=0; 
      cout<<"\nEnter Order ID : "; 
      cin>>orderId; 
    } 
    void viewOrderDetails(){ 
     for(int j=0;j<20;j++){ 
     Item ii=items[j]; 
     orderValue=orderValue+ii.getItemTotal(); 
     } 
     cout<<"Order ID : "<<orderId<<endl; 
     cout<<"Order Value : "<<orderValue<<endl; 
    } 

    void addToOrder(Item i){ 
     if(index<19){ 
     items[index]=i; 
     index=index+1; 
     }else{ 
     cout<<"\nOrder Full"; 
     } 
    } 
}; 

int main(){ 
    Order odr1; 

    Item i1; 
    Item i2; 

    odr1.addToOrder(i1); 
    odr1.addToOrder(i2); 

    odr1.viewOrderDetails(); 

    return 0; 
} 

Я хочу запустить конструктор класса Order. Но он запускает класс «Конструктор класса». Я проверил код много раз и сделал исследование. Но я не могу ошибаться в коде. Я использую CodeBlocks IDE с компилятором GCC (MingGW). Я ценю, если кто-нибудь может мне помочь в этом. Спасибо.

+0

Исследование? Что ты нашел? Что вы пробовали? –

+4

'Order' содержит массив из 20' Item', которые создаются перед тем, как выполняется тело конструктора 'Order'. –

+2

Как правило, не рекомендуется иметь какое-либо взаимодействие с пользователем в конструкторе. – molbdnilo

ответ

1

Конструктор вашего класса Order будет вызван.

Item items[20]; // <-- here you actually create 20 Items and the constructor for each Item will be called. Then the Order Constructor will get called. 

Вы можете использовать std::list<Item> items; вместо Item items[20]. В этом случае вы фактически не создаете элемент (и поэтому его конструктор не будет вызван) вы просто создаете контейнер, в котором вы можете хранить свои предметы.

В любом случае, это плохая практика делать то, что вы делаете в своем конструкторе. Конструктор должен инициализировать объект, и он должен работать быстро. Поэтому создайте метод.

+0

Да, я понял :) Спасибо за помощь .. –

0

Ваш класс Заказ:

class Order{ 
     int index; 
     int orderId; 
     double orderValue; 
     Item items[20]; 
    public: 
     Order(){ 

     // the body of the constructor 

Ваш Order класс содержит массив из 20 Item с.

Прежде чем код в конструкторе будет выполняться, сначала должны быть построены все члены класса.

Поскольку ваш Order класс содержит 20 Item с, каждый из них должен быть построен первый и Item «s конструктор по умолчанию будет вызываться в двадцать раз, прежде чем тело из Order» конструктор s начинает выполнение. Вот как работает C++.

Это объяснение того, почему вы видите код в конструкторе по умолчанию Item, который, по-видимому, выполняется перед кодом в конструкторе по умолчанию Order.

Вместо:

Item items[20]; 

вам нужно использовать вектор:

std::vector<Item> items; 

и имеют addToOrder() использование push_back() для инициализации вектора.

+0

Хорошо, я это понял. Спасибо за вашу поддержку. :) Я очень ценю это. –

Смежные вопросы