1

我仍在学习 C++ 并摆弄运算符重载。

现在,我必须生成一个输出,虽然我不确切知道输入时它将是哪种数据类型 - 它在 中指定,makefile可以是double,structenum.

先上代码:

#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 Complexstruct Vectorenum

检查TYPE也不起作用,因为编译器仍然会抛出错误。

问题
有没有办法为不同的输入参数设置各种重载程序,或者至少做一些事情来避免返回奇怪的输出TYPE operator * (Vector A, Vector B)

4

1 回答 1

1

尝试调用默认构造函数,例如:

TYPE Output = TYPE();
于 2013-04-05T21:37:47.300 回答