运算符重载(int as bool)

时间:2013-05-09 19:19:07

标签: c++ operator-overloading

我正在尝试编写一个返回1和0而不是true或false的代码。但这似乎不对。

int Short_Vector::operator==(const Short_Vector& obj){
    if(a == obj.a && b == obj.b && c == obj.c && d == obj.d){
        return 1;
    }else{
        return 0;
    }
 }

因此它应该为每个变量返回一个值。

我也试过这个:

int Short_Vector::operator==(const Short_Vector& obj){
    int a_tf, b_tf, c_tf, d_tf;
    if(a == obj.a){
        a_tf = 1;
    }else{
        a_tf = 0;
    }
    if(b == obj.b){
        b_tf = 1;
    }else{
        b_tf = 0;
    }
    if(c == obj.c){
        c_tf = 1;
    }else{
       c_tf = 0;
    }
    if(d == obj.d){
       d_tf = 1;
    }else{
        d_tf = 0;
    }
    return(a_tf, b_tf, c_tf, d_tf)
}

但是我得到一个关于逗号是运算符的错误。

修改

获取错误:错误:从'int'转换为非标量类型'Short_Vector。

我正试图表示一个看起来像这样的矢量[9,1,5,5]。

然后我会说

`Short_Vector a(2, 6, 9, 4);

Short_Vector b(3, 8, 7, 6);

Short_Vector c = a == b;

cout<<c;`

然后输出:[0,0,0,0]

5 个答案:

答案 0 :(得分:3)

您可以使用std::bitset为每个成员设置相等的位

std::bitset<4> Short_Vector::operator==(const Short_Vector& obj){
    std::bitset<4> r;

    r[0] = (a == obj.a);
    r[1] = (b == obj.b);
    r[2] = (c == obj.c);
    r[3] = (d == obj.d);

    return r;
}

你可以像

一样使用它
Short_Vector a(1,2,3,4);
Short_Vector b(1,0,3,4);

std::bitset<4> res = (a==b);
std::cout << res;

应该给你

1011

std::bitset很好,因为它提供了方便的方法,例如all anynone(以及更多)。这样您就可以轻松检查汇总值。

答案 1 :(得分:3)

第二种方法不起作用,因为返回类型是'int','(a_tf,b_tf,c_tf,d_tf)'不是int,而是以逗号分隔的4个整数。

由于您想要返回4个布尔值,您可以执行以下操作:

int Short_Vector::operator==(const Short_Vector& obj)
{
    //...
    return (a_tf) | (b_tf << 1) | (c_tf << 2) | (d_tf << 3);
}

//the caller would do the follwoing:

int result = (MyObject1 == MyObject2);

if(result & (1 << 1) //b_tf is set to 1;
{
}
if(result & (1 << 3) //d_tf is set to 1;
{
}

答案 2 :(得分:2)

如果您希望将结果设为Short_Vector,请尝试以下操作:

Short_Vector Short_Vector::operator==(const Short_Vector& obj) {
    return Short_Vector(
        a == obj.a,
        b == obj.b,
        c == obj.c,
        d == obj.d
    );
}

答案 3 :(得分:1)

逗号运算符不会按照您的假设运行。它实际上会评估每个操作数并返回最后一个操作数。编译器给你一个关于这个小误解的警告。

另一种方法是设置每个位包含与布尔表达式相当的数字true / false

unsigned int n = 0;

n |= (a == obj.a) << 0;
n |= (b == obj.b) << 1;
n |= (c == obj.c) << 2;
n |= (d == obj.d) << 3;

return n;

您可以使用较小的数据类型,例如char,也可以使用 std::bitset

答案 4 :(得分:1)

如果必须使用int作为返回类型,则可以使用左移位运算符并执行以下操作:

int result = 0;
result += a_tf << 3; //Shifts the bit 3 places to the left.
result += b_tf << 2; //Shifts the bit 2 places to the left.
result += c_tf << 1; //Shifts the bit 1 place to the left.
result += d_tf; //Puts d_tf as bit 0
return result;

要让每个人退出,请按位使用:

result = obj1 == obj2; //Where obj1 and 2 are your compared objects
int a_tf = (result >> 3) & 1;
int b_tf = (result >> 2) & 1;
int c_tf = (result >> 1) & 1;
int d_tf = result & 1;

虽然我不得不说使用bitset的Named解决方案更容易理解,但插入/检索单个值更容易。