0

設計上の問題があります。私のアプリケーションでは、 で管理するクラスがいくつかありますstd::shared_ptr。これらのクラスは、私たちstd::shared_ptrだけが作成する必要があることを強制したいと考えています。したがって、次のようなことを考えました。

template <typename T>
class make_sharable_only
{
    make_sharable_only();
    ~make_sharable_only();

public:
    template <typename ...Args>
    static std::shared_ptr<T> CreateShareInstance(Args ...args)
    {
        std::shared_ptr<T> ptr;
        ptr.reset(new T(args...));

        return ptr;
    }

};
    class A: public make_sharable_only<A>
    {

    };

void f()
{
    auto aPtr = A::CreateShareInstance();
}

しかし、問題は、A のインスタンスを作成することさえできないことです。関係CreateShareInstanceを作成したくありません。friendこの目的のためにそのような基本クラスを定義する方法はありますか?

前もって感謝します。

4

2 に答える 2

3

関係を作りたくないfriend

なぜだめですか?有効なソリューションを拒否する理由

他のクラスにプライベート/保護されたメンバーへの特別なアクセスを持たせたい場合は、クラスから派生する (クラスのベースではない) か、クラスのフレンドである必要があります。

にプライベートコンストラクターを用意するつもりだったと思いますA

これも:

    std::shared_ptr<T> ptr;
    ptr.reset(new T(args...));

    return ptr;

次のようにする必要があります。

    return make_shared<T>(std::forward<Args>(args)...);

このように記述すれば、基本クラスを試して使用する理由がないほど簡単です。ファクトリ関数をAに配置するだけで、3 行のコード (テンプレートにするのに 4 行) しかかかりません。

class A {
  A() = default;
public:
  static std::shared_ptr<A> create() {
    return std::make_shared<A>();
  }
};
于 2013-04-24T17:43:47.923 に答える
0

は非公開のshared_ptr<make_sharable_only>ため、インスタンス化できません。make_sharable_only::~make_sharable_onlyコンストラクターをプライベートのままにして、デストラクタをパブリックにすることができます (わかりました。誰かが shared_ptr から取得した生のポインターを削除する可能性がありますが、誤ってそれを行う可能性は低いです)。

于 2013-04-25T04:50:54.870 に答える