Редактировать: Приведенные здесь примеры не соблюдают правило Большой тройки (спасибо @Philipp!). Если определение A используется, как указано ниже, код будет сбой при построении копирования для A или при назначении для A. Чтобы правильно определить код, оператор присваивания и конструктор копирования должны быть явно определены для A (или явно запрещены) объявленный как частный и никогда не реализованный). (Конец Edit)
Должен ли я передавать их по значению, по (сопзЬ) ссылки или указатель?
Если A использует В и С, а затем, удерживая их по ссылке или указателю внутри А. Для того, чтобы выбрать между ссылкой и указателем, увидеть, как B и C выделены.
Если они представляют собой локальные объекты стека, построенные в том же объеме, что и A, то передают их по ссылке const.
Если они динамически выделяются объекты, которые используют, сделать собственный их: пройти мимо них указателями и имеет деструктор A удалит их.
Если они необязательные компоненты А, передать их по указателю (который может быть пустым).
Если A не несет ответственности за удаление, отправьте их по следующему адресу: * const
.
Где я могу их освободить?
Обычно, когда вы больше не нуждаетесь в них :).
Если они необходимы после области A (если они являются внешними объектами, которые использует A), то удалите их, когда область действия A закончена.
Если они принадлежат A, удалите их в деструкторе для A. Это может иметь смысл также удалить их в течение жизни A, если указатели должны быть изменены.
Вот пример, где B является заменяемым компонентом, введенным в A (и принадлежащим A), а C является необязательным компонентом, принадлежащим A (но также введенным в A).
(«принадлежит» означает, что А отвечает за удаление обоих объектов)
class B;
class C;
class A
{
B* b;
C* c;
public:
A(B* const bb, C* const cc = 0) // cc is optional
: b(bb), c(cc)
{
}
void resetB(B* const bb = 0)
{
delete b;
b = bb;
}
~A()
{
resetB();
delete c;
}
};
{
A a(new B, new C);
a.resetB(); // delete B
a.resetB(new B); // delete former B and set a new one
} // both members of A are deleted
Но я не знаю, является ли это хорошо практика или нет. Какие-либо предложения?
Это до вас на самом деле, но вы можете написать A a(B(1, 2, 4), C(1, 2, 3))
так легко, как A a(new B(1, 2, 4), new C(1,2,3));
(в первом случае - один без нового - А :: б и A :: с должны быть ссылки или объекты/значения внутри класс и A не должны удалять их вообще).
Вопрос не должен быть, если вы хотите написать инструкцию с динамическим распределением для B и C, но если вам нужно. Динамическое распределение происходит медленно, и если у вас нет требования к нему, вы не должны этого делать.
См. [_Как передать объекты в функции на C++? _] (Http://stackoverflow.com/questions/2139224/how-to-pass-objects-to-functions-in-c/2139254#2139254) – sbi