【问题标题】:How to avoid ambiguity in constructors with default parameters?如何避免具有默认参数的构造函数中的歧义?
【发布时间】:2016-11-03 02:34:03
【问题描述】:

假设我有一个class Point,可以用直角坐标和极坐标构造。而且我还想要默认参数,它将在坐标 (0, 0) 中创建 Point

所以,我想要一些代码:

Class Point{
 public:
    Point(double x = 0, double y = 0); // Rectangular coordinates
    Pount(double r = 0, double a = 0); // Polar coordinates (radius and angle)
    ...
}

但显然这是一个糟糕的决定,因为我们甚至无法拨打电话Point()。因此,作为解决方法,我们可以使用非默认的第一个参数(即仅int x, ...)创建一个构造函数。但是如果我们只想指定 x 怎么办,那么我们又会得到一个关于歧义的错误。

如何正确设计这样的构造函数?

【问题讨论】:

  • 第 1 步。不要使用默认参数。这是众多原因之一。
  • @CoryKramer 如果有充分的理由使用默认参数怎么办?
  • @CoryKramer 你能给出一些解释的链接吗? (了解其他原因,或者解释一下)
  • 为什么要为此使用 2 个单独的构造函数?如果用户有单独的 RGB 值,他们可以简单地将Color(r, g, b) 传递给颜色参数。
  • @MrPisarik:这是一个完美的例子。解决方案是命名构造函数成语。 isocpp.org/wiki/faq/ctors#named-ctor-idiom

标签: c++


【解决方案1】:

在这种情况下,使用 GOF 的 Builder 模式是有意义的。

类似的,

BubbleBulder bb;
bb.setGeomtery(x, y, radius); // or separate setters for each members
bb.setColor(new Color(0, 0 ,0));
std::unique_ptr<Bubble> bubblePtr = bb.createInstance(); // or move

【讨论】:

    猜你喜欢
    • 2017-09-27
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多