Я думаю, это зависит от того, где вы будете их использовать. Я предполагаю, что вы думаете сделать что-то вроде этого:
template <class T>
class BinaryTreeNode
{
//public interface ignored for this example
private:
shared_ptr<BinaryTreeNode<T> > left;
shared_ptr<BinaryTreeNode<T> > right;
T data;
}
Это имело бы смысл, если вы ожидаете, что ваша структура данных будет обрабатывать динамически создаваемые узлы. Однако, поскольку это не нормальный дизайн, я думаю, что это неуместно.
Я бы ответил, что нет, это неподходящее место для использования shared_ptr, так как использование shared_ptr подразумевает, что объект на самом деле является общим, однако узел в двоичном дереве не никогда не используется совместно. Однако, как заметил Мартин Йорк, зачем изобретать велосипед, ведь уже есть умный тип указателя, который делает то, что мы пытаемся сделать, — auto_ptr. Итак, сделайте что-то вроде этого:
template <class T>
class BinaryTreeNode
{
//public interface ignored for this example
private:
auto_ptr<BinaryTreeNode<T> > left;
auto_ptr<BinaryTreeNode<T> > right;
T data;
}
Если кто-то спросит, почему данные не являются shared_ptr, ответ прост: если копии данных подходят для клиента библиотеки, они передаются в элементе данных, а узел дерева делает копировать. Если клиент решит, что копировать — плохая идея, тогда код клиента может быть передан в shared_ptr, который узел дерева может безопасно скопировать.
person
Harper Shelby
schedule
17.12.2008