7

我正在阅读一篇关于Named Constructors的文章。它已将命名构造函数声明为静态的。这可能是什么原因。难道非静态方法不能达到同样的目的吗?

4

4 回答 4

15

非静态函数与类的对象相关联。

在这种情况下,函数的重点是创建类的对象。当您调用该函数时,没有可以与该函数调用关联的类的实例。

于 2013-07-21T05:22:34.783 回答
3

它们必须是static方法。

class Point {
public:
  static Point rectangular(float x, float y);      // Rectangular coord's
  static Point polar(float radius, float angle);   // Polar coordinates

  ...
private:
  Point();
  Point(float x, float y);     // Rectangular coordinates
  float x_, y_;
};

Named Constructor Idiom中,您应该创建构造函数privateor protected,因此您不能以直接的方式构造对象。

另一方面,static方法不需要调用对象,所以它们也不需要构造函数。

因此,您可以使用static方法来执行某些操作,例如返回构造的对象。

于 2013-07-21T05:25:02.277 回答
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只是类Point的工厂

于 2013-07-21T05:22:22.990 回答
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 回答