0

次のコードがあります。

template<class T>
class RandomTreeNode {
private:
    RandomTreeNode<T> *left;
    RandomTreeNode<T> *right;
public:
    RandomTreeNode(): left(0), right(0) {}

    void create_left_child(){ left = &RandomTreeNode<T>();}
    void create_right_child(){ right = &RandomTreeNode<T>();}

しかし、一時変数のアドレスを指しているため、コンパイル エラーが発生します。作成された新しい RandomTreeNode を関数の最後で破棄したくないのですが、どうすればこれを達成できますか?

4

2 に答える 2

8

使用する:

void create_left_child()
{
    left = new RandomTreeNode<T>();
}

void create_right_child()
{
    right = new RandomTreeNode<T>();
}

また、それらが不要になったとき (おそらくツリー全体が破壊されたとき、またはその特定のノードが削除されたとき) にそれらを削除する必要があることを忘れないでください。

于 2012-10-22T17:28:02.913 に答える
4

これが私がそれを行う方法です:

template<class T>
class RandomTreeNode {
    std::unique_ptr<RandomTreeNode<T> > left;
    std::unique_ptr<RandomTreeNode<T> > right;

    RandomTreeNode(): left(0), right(0) {}

    void create_left_child(){ left.reset(new RandomTreeNode<T>());}
    void create_right_child(){ right.reset(new RandomTreeNode<T>());}
}

デストラクタも手動のメモリ管理も必要ありません。

于 2012-10-22T17:31:50.487 に答える