5

ファクトリメソッドを持つクラスがあるとします

class A {
public:
  static A* newA()
  {
    // Some code, logging, ...
    return new A();
  }
}

newファクトリ メソッドがオブジェクトのインスタンスを作成する唯一のメソッドになるように、 このクラスのオブジェクトのインスタンス化を で防ぐことは可能ですか?

4

2 に答える 2

8

もちろん; コンストラクターをプライベートにするだけです(これが基本クラスの場合は保護されます):

class A {
public:
  static A* newA()
  {
    // Some code, logging, ...
    return new A();
  }

private:
  A() {}  // Default constructor
};

必要に応じて、コピー コンストラクターも非公開/保護する必要があります。

そしていつものように、メモリ管理の問題を簡素化するために、生のポインターではなくスマート ポインターを返すことを強く検討する必要があります。

于 2012-05-11T20:46:52.623 に答える
3

コピー コンストラクターもプライベートにするか、新しい C++11 構文を使用して、コンパイラーにコピーしないように明示的に指示し、次のようにして既定のコンストラクターをプライベートにすることもできます。

struct NonCopyable {
    NonCopyable & operator=(const NonCopyable&) = delete;
    NonCopyable(const NonCopyable&) = delete;
    NonCopyable() = default;
};

class A : NonCopyable {
public:
  static std::shared_ptr<A> newA()
  {
    // Some code, logging, ...
    return std::make_shared<A>();
  }

private:
  A() {}  // Default constructor
};

C++03 の方法は通常、次のようなものでした。

class A {
public:
  static A* newA()
  {
    // Some code, logging, ...
    return new A();
  }

private:
  A() {}                        // no outsider default constructor
  A(const A& rhs);              // no copy
  A& operator=(const A& rhs);   // no assignment
};

int main()
{
    A x;        // C2248
    A y(x);     // C2248
    x = y;      // C2248
    A* p = A::newA(); // OK
    std::cin.get();
    return 0;
}
于 2012-05-11T20:58:44.637 に答える