Это зависит от того, что вы пытаетесь сделать.Во-первых, как прокомментировал 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()
и шаблон наблюдателя для уведомления супруга.)
В подобных случаях (которые, по моему опыту, представляют подавляющее большинство динамически размещаемых объектов в C ++), единственное различие между C ++ и Java состоит в том, что в C ++ есть специальный синтаксис для вызова «деструктора»;в Java вы используете обычный синтаксис вызова функции и можете присвоить функции любое имя по вашему желанию (хотя dispose
кажется широко используемым).Специальный синтаксис позволяет компилятору генерировать дополнительный код для освобождения памяти, но все другие действия, связанные с окончанием времени жизни объекта, все еще должны быть запрограммированы (в деструкторе в C ++ - хотя в этом случае это может сделатьсмысл ставить некоторые из них прямо в функцию Wife::die
).