Привет, у меня есть проблема с составом объекта.
Класс 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 и у меня есть вопрос по этому поводу. Должен ли я создавать элементы счета-фактуры без создания объекта счета-фактуры или наоборот? Что более логично?
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
становится недействительным. Я надеюсь, вы понимаете разницу.
Вы должны передать указатель на 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
это не изменит остальную часть вашего кода ..
CInvoice::CInvoice(CCustomer &Customer)
{
customer = &Customer;
}
а может ты нед?
В файле Invoice.h есть строка:
CCustomer customer;
И упомянутый конструктор выглядит так ??
CInvoice::CInvoice(const CCustomer &Customer)
: customer(Customer)
{
}