为特定类型参数设置未知类型的初始值或重载运算符 我仍然在学习C++和篡改操作符超载。< /P>
现在,我必须生成一个输出,虽然我不知道输入时它将是什么样的数据类型-它在为特定类型参数设置未知类型的初始值或重载运算符 我仍然在学习C++和篡改操作符超载。< /P>,c++,operator-overloading,C++,Operator Overloading,现在,我必须生成一个输出,虽然我不知道输入时它将是什么样的数据类型-它在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 Symb
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;
}
对于符号
Symbol X;
X = e;
而对于加倍
,则一如既往
我提出的解决方案是为特定类型重载操作符
:
double operator * (Vector A, Vector B); // [1]
Symbol operator * (Vector A, Vector B); // [2]
Complex operator * (Vector A, Vector B); // [3]
但是编译器给我带来了错误,因为我已经重载了[3]
,虽然对于复杂的[1]
类型作为输入,但在[1]
之后,由于数据类型不兼容,我无法再执行2.05*1.1
我还考虑将Init()
函数添加到struct Complex
和struct Vector
。但它不适用于enum
检查类型
也不起作用,因为编译器仍然会抛出错误
问题
在类型运算符*(向量A、向量B)
中,是否可以为不同的输入参数设置不同的重载过程,或者至少采取措施避免返回奇怪的输出?尝试调用默认构造函数,例如:
TYPE Output = TYPE();
尝试调用默认构造函数,例如:
TYPE Output = TYPE();
所有这些实际上都不是初始化。任何初始化都将在Complex中完成代码>或符号X代码>语句。这些都不是真正的初始化。任何初始化都将在Complex中完成代码>或符号X代码>声明。谢谢-它就像一个符咒。它是如此的琐碎,以至于我已经忘记了它,特别是如果我总是在C#…中使用它,那真是太遗憾了。谢谢,它就像一个符咒。它是如此的琐碎以至于我已经忘记了它,特别是如果我总是在C#中使用它,那真是太遗憾了。。。