我仍在学习 C++ 并摆弄运算符重载。
现在,我必须生成一个输出,虽然我不确切知道输入时它将是哪种数据类型 - 它在 中指定,makefile
可以是double
,struct
或enum
.
先上代码:
#include <iostream>
#define TYPE Complex
//#define TYPE Symbol
//#define TYPE double
using namespace std;
struct Complex {
double Re;
double Im
};
enum Symbol {
a, b, c, d, e
};
struct Vector {
TYPE Data[4];
//more in struct, but it's irrelevant
};
// operator * overloads for Complex and Symbol here
// output stream operator for Vector, Symbol and Complex
// are also overloaded
TYPE operator * (Vector A, Vector B) {
TYPE Output;
int i;
for (i=0; i<4; i++) {
Output = A.Data[i] * B.Data[i];
}
return Output;
// the output is garbage, because TYPE Output is not
// set (to 0) at the beginning
}
int main {
TYPE x;
// ...
x = SomeVectorA * SomeVectorB;
cout << x << endl;
// ...
return 0;
}
由于TYPE Output
初始化后未设置该值,因此重载将在输出处产生垃圾 - 当我设置它时它会有所帮助,但这是一个问题。为每种类型设置初始值以不同的方式完成。
所以对于Complex
它
Complex X;
X.Re = 0;
X.Im = 0;
为了Symbol
Symbol X;
X = e;
和double
往常一样。
我想出的解决方案是operator
为特定类型重载:
double operator * (Vector A, Vector B); // [1]
Symbol operator * (Vector A, Vector B); // [2]
Complex operator * (Vector A, Vector B); // [3]
但是编译器向我抛出了错误,因为我已经重载了[3]
,尽管Complex
类型作为输入,并且由于数据类型不兼容而[1]
我不能再做。2.05 * 1.1
我也在考虑为and添加Init()
功能。但它不会为.struct Complex
struct Vector
enum
检查TYPE
也不起作用,因为编译器仍然会抛出错误。
问题
有没有办法为不同的输入参数设置各种重载程序,或者至少做一些事情来避免返回奇怪的输出TYPE operator * (Vector A, Vector B)
?