2016-11-17 19 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クラスのコンストラクタを実行します。 コードを何度もチェックしてリサーチを行いましたが、コードでは間違っているようです。 私はGCCコンパイラ(MingGW)でCodeBlocks IDEを使用しています。 誰かが私を助けることができれば感謝します。おかげさまで

+0

研究の?あなたは何を見つけましたか?何を試しましたか? –

+4

'Order'は、' Order'のコンストラクタの本体が動作する前に構築される20個の 'Item'の配列を含んでいます。 –

+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実行を開始コンストラクタのデフォルトコンストラクタはOrderの体の前に、20回呼び出さ取得する予定です」。これがC++の仕組みです。

Orderのデフォルトのコンストラクタのコードの前に、Itemのデフォルトのコンストラクタが明白に実行されているのを見る理由です。

std::vector<Item> items; 

とベクトルを初期化するaddToOrder()使用push_back()を持っている:

Item items[20]; 

あなたは、ベクターを使用する必要があります。代わりの

+0

わかりました。 ご協力いただきありがとうございます。 :) 本当にありがたいです。 –

関連する問題