4

std::auto_ptr を boost::shared_ptr に変更するにはどうすればよいですか? ここに私の制限があります: 1. API クラスを使用しています。これらのポインターを返す only_auto と呼びましょう 2. auto_only で呼び出しを使用する必要があります 3. 私のセマンティクスには共有が含まれているため、shared_ptr を使用する必要があります) 4. class only_auto 演算子 = 対処を防ぐために非公開です 5. また、クローン呼び出し std::auto_ptr creat_only_auto(); によって only_auto オブジェクトを作成する必要があります。

テンプレートの明示的な shared_ptr(std::auto_ptr & r); を知っています。しかし、このシナリオでどのように使用するのですか?

非常に単純化されたコード例:

    #include <iostream>
    #include <memory>
    #include <boost/shared_ptr.hpp>

    using namespace std;

    class only_auto
    {
      public:
      static auto_ptr<only_auto> create_only_auto();
      void func1();
      void func2();
      //and lots more functionality

      private:
      only_auto& operator = (const only_auto& src);
    };

    class sharing_is_good : public only_auto
    {
      static boost::shared_ptr<only_auto> create_only_auto()
      {
        return boost::shared_ptr (only_auto::create_only_auto()); //not the correct call but ...
      }

    };

    int main ()
    {
       sharing_is_good x;

       x.func1();
    }
4

3 に答える 3

4

コンストラクターは次のshared_ptrように宣言されます。

template<class Other>
shared_ptr(auto_ptr<Other>& ap);

非 const 左辺値参照を取ることに注意してください。これはauto_ptr、 のオブジェクトの所有権を正しく解放できるようにするためです。

const ではない左辺値参照を使用するため、このメンバー関数を右辺値で呼び出すことはできません。

return boost::shared_ptr(only_auto::create_only_auto());

結果を変数に格納し、only_auto::create_only_auto()その変数をshared_ptrコンストラクターに渡す必要があります。

std::auto_ptr<only_auto> p(only_auto::create_only_auto());
return boost::shared_ptr<only_auto>(p);
于 2012-05-24T16:28:07.030 に答える
1

3. My semantics involves sharing so I do need to use a shared_ptr)

auto_ptr の最も有効な使用法は、std::unique_ptr とソース互換性があるため、それに変換することを検討することをお勧めします。すべてが正常に構築されていれば、安全です。(まだ typedef を使用していない場合は、将来型を簡単に変更できるように、typedef の使用に移行することをお勧めします。) コンパイル エラーが発生した場合は、以前に無効化された型を使用していたコードにバグがある可能性があります。 auto_ptr.

unique_ptr で物事を検証した後、std::shared_ptr への移行のみを検討する必要があると思います。共有所有権が本当に必要であることがわかります (多くの場合、一意の所有権と非所有ポインターを使用できます)。

于 2012-05-24T18:25:44.407 に答える