Ответ 1
Это зависит от того, что вы пытаетесь сделать. Во-первых, поскольку Kerrek SB
прокомментировал, вы не хотите использовать указатели, если семантика значений может быть
применяется: если Wife
можно копировать и присваивать, то почти нет причин
для его динамического распределения. В этом случае, однако, я предполагаю, что
Wife
происходит от Person
(хотя, возможно, декоратор для Person
было бы более уместным, поскольку тот факт, что данный Person
isA
Wife
может меняться со временем), что могут быть даже типы, полученные
от Wife
(и что Person::current_wife
может захотеть провести один из
эти), и что на самом деле Wife
имеет тождество; вам не нужны копии
та же жена повсюду.
Если это так, то вам действительно нужно определить протокол для
взаимодействия других классов с Wife
. Как правило, время жизни
Wife
не будет зависеть от Person
, который его удерживает (хотя, если это
декоратор, он может), поэтому Person
должен просто удерживать указатель на него, так как
ты сделал. Скорее всего, объект Wife
будет иметь различные функции
который неявно или явно не контролирует его продолжительность жизни: вы
может иметь что-то вроде:
void Wife::die()
{
// ...
delete this;
}
например. В этом случае, однако, тот, кто женат на Wife
, будет
должны быть проинформированы, чтобы current_wife
не указывал на мертвых
супруг. Обычно некоторый вариант шаблона наблюдателя можно использовать для
это. (Обратите внимание, что у вас есть точно такая же проблема на Java;
хотите, чтобы Person::current_wife
указывал на мертвый Wife
. Так что вы все равно
нужна функция Wife::die()
, а шаблон наблюдателя - для уведомления
супруг.)
В подобных случаях (которые по моему опыту представляют подавляющее большинство
динамически выделенных объектов в С++), о единственной разнице
между С++ и Java является то, что С++ имеет специальный синтаксис для вызова
"Деструктор"; в Java вы используете обычный вызов функции
синтаксис, и вы можете дать функции любое имя, которое вы хотите (хотя
dispose
кажется широко используемым). Специальный синтаксис позволяет компилятору
генерировать дополнительный код для освобождения памяти, но все остальные
действия, связанные с окончанием срока службы объекта, все еще должны
быть запрограммированным (в деструкторе, на С++), хотя в этом случае он
может иметь смысл поместить некоторые из них непосредственно в Wife::die
функция).