2016-11-17 130 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类的构造函数。 但它运行Item类的构造函数。 我检查了很多次的代码并做了一项研究。但我在代码中似乎没有任何错误。 我正在使用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]。在这种情况下,你实际上并没有创建一个Item(因此它的构造函数不会被调用),你只需创建一个容器来存储你的项目。

无论如何,在构造函数中做你所做的事是不好的做法。构造函数应该初始化对象,并且它应该运行得很快。因此改为创建一个方法。

+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 S,他们每个人必须首先构建和Item的默认构造函数将会被调用二十次,在Order主体之前“开始执行的构造函数。这就是C++的工作原理。

这是为什么你看到Item的默认构造函数中的代码明显在Order的默认构造函数之前执行的解释。

相反的:

Item items[20]; 

你需要使用一个向量:

std::vector<Item> items; 

,并有addToOrder()使用push_back()初始化向量。

+0

好吧,我明白了。 感谢您的支持。 :) 我真的很感激它。 –