3

auto_ptr を NULL または同等のものに設定する方法はありますか? たとえば、ノード オブジェクトで構成されるバイナリ ツリーを作成しています。

struct Node {
    int weight;
    char litteral;
    auto_ptr<Node> childL;
    auto_ptr<Node> childR;
    void set_node(int w, char l, auto_ptr<Node> L, auto_ptr<Node> R){
        weight = w;
        litteral = l;
        childL = L;
        childR = R;
    }
};

親ノードではないノードの場合、これを行うことを計画していました。

auto_ptr<Node> n(new Node);
(*n).set_node(i->second, i->first, NULL, NULL);

これはエラーをスローします。それをNULLに設定する方法はありますか、それとも意味のある別の行動方針がありますか?

4

2 に答える 2

6

ポインターを受け取るstd::auto_ptrコンストラクターは明示的であり、誤って所有権を に譲渡するのを防ぐのに役立ちますstd::auto_ptr。デフォルトで構築された 2 つのstd::auto_ptrオブジェクトを渡すことができます。

(*n).set_node(i->second, i->first, std::auto_ptr<Node>(), std::auto_ptr<Node>());

対象とする標準ライブラリの実装に が含まれている場合はstd::unique_ptr、代わりにそれを使用することを検討してください。の問題のあるコピー セマンティクスがないstd::auto_ptrため、std::auto_ptr廃止され、 に置き換えられましたstd::unique_ptr

std::unique_ptrには、null ポインター定数からの暗黙的な変換を可能にする変換コンストラクターもありNULLますstd::unique_ptr

于 2012-08-15T18:19:50.430 に答える
2

コンパイラ ツールセットがサポートしている場合は std::unique_ptr に切り替えるか (Visual C++ 10/11、Gcc 4.5 以降など)、boost::scoped_ptr を使用することをお勧めします (Visual C++ 9 以前で最近のバージョンを使用している場合)。ブーストの)、std::auto_ptr での基本的なコピー セマンティックの問題を回避します。

注: std::unique_ptr は C++11 の機能であり、コンパイラを選択するために追加の要件が課される場合があります。

于 2012-08-15T19:11:41.757 に答える