我正在阅读一篇关于Named Constructors的文章。它已将命名构造函数声明为静态的。这可能是什么原因。难道非静态方法不能达到同样的目的吗?
问问题
616 次
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中,您应该创建构造函数private
or 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 回答