如何区分具有相同参数的两个构造函数?

cib*_*en1 33 c++ parameters constructor

假设我们想要一个表示复数的类的两个构造函数:

Complex (double re, double img)  // construct from cartesian coordinates
Complex (double A, double w) // construct from polar coordinates
Run Code Online (Sandbox Code Playgroud)

但参数(数量和类型)是相同的:确定目标是什么的更优雅的方法是什么?将第三个参数添加到其中一个构造函数中?

Myk*_*yev 43

最好添加具有适当名称的静态方法,并让它们创建对象.

static Complex createFromCartesian(double re, double img);
static Complex createFromPolar(double A, double w);
Run Code Online (Sandbox Code Playgroud)

  • @Mykola:如果有复杂+复杂是有意义的,并且从Polar制作复合体是有意义的,那么复杂+复杂(Polar)必须有意义,这意味着复杂+极地必须有意义. (2认同)

小智 36

您不能拥有两个具有相同签名的构造函数(或任何函数).最好的解决方案可能是为您的坐标类型创建类,并在这些类上重载.例如:

struct CartCoord {
    CartCoord( double re, double img ) : mRe(re), mImg(img) {}
    double mRe, mImg;
};

struct PolarCoord {
    PolarCoord( double a, double v ) : mA(a), mV(v) {}
    double mA, mV;
};
Run Code Online (Sandbox Code Playgroud)

然后您的构造函数变为:

Complex( const CartCoord & c );
Complex( const PolarCoord & c);
Run Code Online (Sandbox Code Playgroud)

正在使用:

Complex c( CartCoord( 1, 2 ) );
Run Code Online (Sandbox Code Playgroud)

您还可以将它们与Complex类的重载运算符一起使用.例如,假设您有一个二进制+运算符,该类定义为:

Complex operator+( const Complex &, const Complex & );
Run Code Online (Sandbox Code Playgroud)

然后:

Complex a( CartCoord( 0, 0 ) );
Complex b = a + PolarCoord( 1, 1 );
Run Code Online (Sandbox Code Playgroud)

由于我们有一个从PolarCoord到Complex的转换构造函数,因此将在+表达式中使用.这比调用静态函数创建临时函数更自然(恕我直言).

这是Koenig的格言(或至少是它的一个版本)的一个例子 - 每当遇到一个难题时,引入一个新级别的类来解决它.


Nav*_*een 8

在Parashift C++ FAQ中使用此处描述的命名构造函数.


Mar*_*lan 5

你不能 - 如果方法签名是相同的,你就被塞满了.

当然,你总是可以为每种类型的坐标系创建一个子类,但这远非理想 - 特别是如果你以后找到一个很好的理由想要将Complex复制为其他原因......