我还在学习C ++并摆弄运算符重载。
现在,我必须生成一个输出,而我不知道它在输入时究竟是什么类型的数据类型 - 它在makefile
中指定,可以是double
,{{ 1}}或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
功能添加到Init()
和struct Complex
。但它不适用于struct Vector
。
检查enum
也不起作用,因为编译器仍然会抛出错误。
问题
是否可以为不同的输入参数设置各种过载程序,或至少做一些事情以避免在TYPE
中返回奇怪的输出?
答案 0 :(得分:1)
尝试调用默认构造函数,例如:
TYPE Output = TYPE();