7

Named Constructorsに関する投稿を読んでいました。名前付きコンストラクターを静的に宣言しました。その理由は何でしょうか。非静的メソッドは同じ目的を果たしませんか?

4

4 に答える 4

15

非静的関数は、クラスのオブジェクトに関連付けられています。

この場合、関数の要点は、クラスのオブジェクトを作成することです。関数を呼び出すとき、その関数呼び出しを関連付けることができるクラスのインスタンスはありません

于 2013-07-21T05:22:34.783 に答える
1

まあ、ある意味では実際に可能です。名前付きコンストラクターは、事実上、ファクトリをターゲット型にマージした結果です。元のファクトリ パターンでは、次のようになります。

class PointFactory {
public:
  Point rectangular(float x, float y);      // Rectangular coord's
  Point polar(float radius, float angle);   // Polar coordinates
  // Of course these *could* be static, but they don't *have* to be.
private:
  /* ... */
};

Point を作成するだけで、複雑なファクトリ タイプを必要としない場合は、ファクトリの機能を Point タイプ自体に単純に移動できます。次にstatic、他の回答に記載されている理由により、「名前付きコンストラクター」メンバー関数を作成する必要があります。

于 2014-01-07T14:20:58.493 に答える
1

いくつかの「魔法の構文」の一部ではありません。クラスPointのファクトリとして機能する単なる静的メンバーです。このリンクから例をコピーし、説明のコメントを追加します。

#include <cmath>               // To get std::sin() and std::cos()

class Point {
public:
  static Point rectangular(float x, float y);      // Its a static function that returns Point object
  static Point polar(float radius, float angle);   // Its a static function that returns Point object
  // These static methods are the so-called "named constructors"
  ...
private:
  Point(float x, float y);     // Rectangular coordinates
  float x_, y_;
};

inline Point::Point(float x, float y)
  : x_(x), y_(y) { }

inline Point Point::rectangular(float x, float y)
{ return Point(x, y); } //Create new Point object and return it by value

inline Point Point::polar(float radius, float angle)
{ return Point(radius*std::cos(angle), radius*std::sin(angle)); } //Create new Point object and return it by value

したがって、Point::rectangularクラスポイントPoint::polarの単なるファクトリです

于 2013-07-21T05:22:22.990 に答える