Ben sadece o zaman başa kolay olurdu, ağaç kendisini değiştirecek:
struct Node
{
Node(data_type data): mLeft(), mRight(), mData(data) {}
Node(const Node& rhs): mLeft(), mRight(), mData(rhs.mData)
{
if (rhs.mLeft.get()) mLeft.reset(new Node(*rhs.mLeft));
if (rhs.right.get()) mRight.reset(new Node(*rhs.mRight));
}
Node& operator=(Node rhs)
{
this->swap(rhs);
return *this;
}
~Node() { }
void swap(Node& rhs)
{
using std::swap;
swap(mLeft, rhs.mLeft);
swap(mRight, rhs.mRight);
swap(mData, rhs.mData);
}
Node* left() const { return mLeft.get(); }
void left(std::auto_ptr<Node> node) { mLeft= node; }
Node* right() const { return mRight.get(); }
void right(std::auto_ptr<Node> node) { mRight = node; }
data_type& data() { return mData; }
const data_type& data() const { return mData; }
private:
std::auto_ptr<Node> mLeft;
std::auto_ptr<Node> mRight;
data_type mData;
};
Nesne Odaklı varlık olarak, her Düğüm şimdi kolları bellekte sorumludur. Ayrıca kullanarak std::auto_ptrarayüzünde o sahipliğini alır açıklık getiriyor.
O derin kopyalama için özel oldu unutmayın, herhangi bir başka yaklaşım gerektiren boost::shared_ptrveya eşdeğeri. Ve evet std::auto_ptrorada, kendiniz kopyalama ile hiçbir sihirli uğraşan bırakır.
Bu tasarım, sade kullanarak daha temiz C-structherkes kaynaklarını işlemek için güçlü olmak ile. Hala erişimcisine yoluyla yatan verilere tam erişime sahip ... ama ONLAR tanımsız davranış çağırmak için özen ...
Tabii ki, yine de aşağı çökmesine sebep olabilir:
Node& node = ...
delete node.left(); // haha
C ++ istenmeyen sorunlar karşı koruyabilir Ama eğer kötülük koduna kapıyı açık bırakır.