MosesA
MosesA

Reputation: 965

Operator Overloading (int as bool)

I'm trying to write a code that returns 1s and 0s instead of true or false. But this doesn't seem to be right.

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;
    }
 }

So it should return a value for each variable.

I also tried this:

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)
}

But I got an error about the commas being an operator.

EDIT

Getting the error: error: conversion from 'int' to non-scalar type 'Short_Vector.

I'm trying to represent a vector that looks like this [9,1,5,5].

Then i'll say

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

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

Short_Vector c = a == b;

cout<<c;`

Output is then: [0,0,0,0]

Upvotes: 0

Views: 170

Answers (5)

Detheroc
Detheroc

Reputation: 1921

If you want to have the result as a Short_Vector, try this:

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

Upvotes: 2

stardust
stardust

Reputation: 5988

You can use std::bitset to set a bit for equality of each member

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;
}

And you can use it like

Short_Vector a(1,2,3,4);
Short_Vector b(1,0,3,4);

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

Should give you

1011

std::bitset is good because it provides convenient methods like all any and none (and many more). So that you can check aggregate values with ease.

Upvotes: 3

VoidStar
VoidStar

Reputation: 984

The second method can't work because the return type is an 'int' and '(a_tf, b_tf, c_tf, d_tf)' is not an int but 4 ints separated by commas.

Since you want to return 4 booleans you could do the following:

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;
{
}

Upvotes: 3

Shaz
Shaz

Reputation: 1396

If you must use an int as a return type, you could use the left shift operator and do something like:

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;

And to get each one back out use the bit-wise and:

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;

Though I have to say Named's solution using a bitset is more easily understood, and inserting/retrieving a single value is much easier that way.

Upvotes: 1

David G
David G

Reputation: 96790

The comma operator won't work the way you presumed. It will actually evaluate each of its operands and return the last. The compiler gave you a warning about this little misconception.

One alternative is to set each bit containing the numeric true/false equivalent of your boolean expressions:

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;

You can use a smaller datatype like char or you can use std::bitset.

Upvotes: 1

Related Questions