我目前有一个名为Complex的课程:
Complex operator+ (const Complex& num1, const Complex& num2);
Complex operator+ (const int num1, const Complex& num2);
Complex operator+ (const Complex& num1,const int num2);
我用来重载加法运算符。目前我有三个独立的函数声明来处理3种不同的情况:2个复数,1个复数和1个int在右边,1个int和1个复数在右边。
Complex operator+ (const Complex& num1,const Complex& num2) {
Complex result;
result.real += num1.real + num2.real;
result.imaginary += num1.imaginary +num2.imaginary;
return result;
}
Complex operator+ (const int num1, const Complex& num2){
Complex result;
result.real += num1;
result.imaginary += num2.imaginary;
return result;
}
Complex operator+ (const Complex& num1, const int num2){
Complex result;
result.real += num2;
result.imaginary += num1.imaginary;
return result;
}
函数声明只是将" real"和"想象的"复数的一部分,并将整数加到复数的实部。
spriteBatch.DrawString(hudFont, "HP: " + p.Attributes.Hp + " / " + p.Attributes.MaxHp, EDGE_BUFFER, Color.White);
必须有更好的方法来做到这一点吗?或者是否必须明确声明所有三种情况?
答案 0 :(得分:3)
如果您将委派构造函数添加到Complex
类。
class Complex{
public:
Complex();
Complex(double, double);
Complex(double a) : Complex(a, 0) {}
然后您会发现只需要定义一个operator+
:
Complex operator+(const Complex &a, const Complex &b);
它将处理您示例中的所有用例。
答案 1 :(得分:0)
首先,函数内部的代码不必要地复杂化。你肯定应该使用它的双参数构造函数初始化result
,而不是初始化为零然后修改。例如,代码可能是:
Complex operator+ (const Complex& num1,const Complex& num2)
{
return Complex(num1.real + num2.real, num1.imaginary + num2.imaginary);
}
Complex operator+ (const Complex& num1, const int num2)
{
return Complex(num1.real + num2, num1.imaginary);
}
Complex operator+ (const int num1, const Complex& num2)
{
return num2 + num1; // compiler will inline this
}
我不确定你为什么在这里使用int
,使用double
似乎更好。
Sam的回答显示了如何将三个功能减少到1.这减少了你必须要做的打字量,虽然它确实会带来轻微的性能降低:你最终做了额外的+ 0.0
关于返回值imaginary
。
如果我们展望乘法,那么这种惩罚会更严重,例如代码:
Complex operator*(Complex const &lhs, double rhs)
{
return Complex(lhs.real * rhs, lhs.imaginary * rhs);
}
比Complex operator*(Complex const &lhs, Complex const &rhs)
内的代码少得多。
因此,您必须在代码简单性和性能之间做出选择。