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)
小智 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的格言(或至少是它的一个版本)的一个例子 - 每当遇到一个难题时,引入一个新级别的类来解决它.
你不能 - 如果方法签名是相同的,你就被塞满了.
当然,你总是可以为每种类型的坐标系创建一个子类,但这远非理想 - 特别是如果你以后找到一个很好的理由想要将Complex复制为其他原因......
归档时间: |
|
查看次数: |
10609 次 |
最近记录: |