1

こんにちは、オブジェクトの構成に問題があります。クラス CInvoice には内部に CCustomer オブジェクトが必要なので、顧客を必要とするコンストラクターを作成しました。

Invoice.h ファイルには次の行があります。

CCustomer *customer;

そして、前述のコンストラクターは次のようになります。

CInvoice::CInvoice(CCustomer Customer)
{
   customer = &Customer;
}

請求書に顧客の名前を印刷しようとすると、ランダムな文字が返されます

CCustomer customer("McDonalds", "Boston, Massachusetts", 4);
CInvoice invoice(customer); 

cout << "Customer:" << customer.GetName() << endl; //it prints "McDonalds"
cout << "Invoice.Customer:" << invoice.customer->GetName() << endl; // it prints random characters

オブジェクト構成を適切に実装しましたか?

また、クラス CInvoiceElement があり、それについて質問があります。請求書オブジェクトを作成せずに請求書要素を作成する必要がありますか、それともその逆ですか? どちらがより論理的ですか?

4

3 に答える 3

4

コンストラクターで CCustomer へのポインターを渡す必要があります。それ以外の場合は、コンストラクターへの引数として使用される CCustomer のコピーのアドレスを取得します。

コードは次のようになります。

CInvoice::CInvoice(CCustomer* _customer)
{
   customer = _customer;
}


.... 
CCustomer customer("McDonalds", "Boston, Massachusetts", 4);
CInvoice invoice(&customer); 

cout << "Customer:" << customer.GetName() << endl; //it prints "McDonalds"
cout << "Invoice.Customer:" << invoice.customer->GetName() << endl; // it prints random characters
于 2013-01-08T14:08:13.673 に答える
4
CInvoice::CInvoice(Customer customer)
{
   customer = &Customer;
}

このメソッドを呼び出すと、次のことが起こります。

  • あなたが呼ぶCInvoice(customer)
  • customer のコピーが引数としてスタックにプッシュされます
  • コピーのアドレスは に割り当てられCustomer *customerます。
  • コンストラクターは終了します
  • スタックが解放され、顧客の引数が無効なポインターになる
  • Customer *customerしたがって、ゴミを指します

あなたがすべきことは、顧客をヒープに割り当て、ポインターを渡すことです。

Customer *customer = new Customer();
CInvoice *invoice = new CInvoice(customer);

CInvoice::CInvoice(Customer *customer) {
  this->customer = customer;
}

このようにして、顧客インスタンスがヒープに割り当てられ、宣言したスコープが保持されます。izomorphius の例も同様に機能しますが、Customer はスコープに対してローカルです (自動的にスタックに割り当てられます)。関数のスコープを終了すると、内部のポインターCInvoiceは無効になります。違いを理解していただければ幸いです。

于 2013-01-08T14:10:14.467 に答える
0

これはあなたのコードの残りの部分を変更しません..

CInvoice::CInvoice(CCustomer &Customer)
{
   customer = &Customer;
}

でも多分あなたはネッド?

Invoice.h ファイルには次の行があります。

CCustomer customer;

そして、言及されたコンストラクターは次のようになります??:

CInvoice::CInvoice(const CCustomer &Customer)
: customer(Customer)
{
}
于 2013-01-08T14:17:04.870 に答える