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 回答