Это зависит от того, что вы пытаетесь сделать. Во-первых, поскольку прокомментировал, что 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
).
Поскольку вы новичок в C++, прислушайтесь к этому совету: никогда не используйте 'new',' delete' или указатели. В качестве исключения вы * можете * использовать 'new' внутри конструктора интеллектуального указателя, но только после того, как вы определили, что вам действительно требуется динамическое хранилище. –
Kerrek забыл порекомендовать [хорошая вводная книга на C++] (http://stackoverflow.com/q/388242/46642) :) –
В OO вам не нужен сеттер, вам нужны функции, позволяющие объекту что-то делать (развод, повторный брак). Сети могут быть удобными, они не являются объектами. – stefaanv