53

オブジェクトのスタック割り当てを防ぎ、ヒープ上で「new」でのみ開始できるようにすることは可能ですか?

4

6 に答える 6

86

これを行う1つの方法は、コンストラクターをプライベートにし、ポインターを返す静的メソッドを介した構築のみを許可することです。例えば:

class Foo
{
public:
    ~Foo();
    static Foo* createFoo()
    {
        return new Foo();
    }
private:
    Foo();
    Foo(const Foo&);
    Foo& operator=(const Foo&);
};
于 2008-09-24T01:32:04.497 に答える
23

C++11の場合

class Foo
{
  public:
    ~Foo();
    static Foo* createFoo()
    {
        return new Foo();
    }

    Foo(const Foo &) = delete; // if needed, put as private
    Foo & operator=(const Foo &) = delete; // if needed, put as private
    Foo(Foo &&) = delete; // if needed, put as private
    Foo & operator=(Foo &&) = delete; // if needed, put as private

  private:
    Foo();
};
于 2012-10-02T20:07:19.110 に答える
12

コンストラクターを作成してから、オブジェクトを作成するための静的ファクトリメソッドをprivate提供できます。public

于 2008-09-24T01:31:50.443 に答える
-1

オブジェクトの抽象インターフェイスを提供するヘッダー ファイルと、ヒープ上に作成されたオブジェクトへのポインターを返すファクトリ関数を作成できます。

// Header file

class IAbstract
{
    virtual void AbstractMethod() = 0;

public:
    virtual ~IAbstract();
};

IAbstract* CreateSubClassA();
IAbstract* CreateSubClassB();

// Source file

class SubClassA : public IAbstract
{
    void AbstractMethod() {}
};

class SubClassB : public IAbstract
{
    void AbstractMethod() {}
};

IAbstract* CreateSubClassA()
{
    return new SubClassA;
}

IAbstract* CreateSubClassB()
{
    return new SubClassB;
}
于 2008-09-24T01:37:39.837 に答える