-1

我试图重载 << 和 >> 运算符以执行小数移位,但我不知道如何做到这一点。例如,我将有一个类 myclass 的成员函数

myclass myclass::operator<<(myclass ob2)
{
    //Code in here for overloading <<
    //In the object, there is a float value to perform the shift on
}

任何帮助将不胜感激!谢谢!!!

4

3 回答 3

4

一般来说,我建议您保留<<非变异,并使用<<=原地更改值。

此外,除非无法设置/获取您的类的float/double成员,否则无需使操作符成为类成员。

struct myclass {
    double value;
};

// mutate in-place: take the instance by non-const reference,
// and return a reference to the same instance
myclass& operator<<=(myclass &self, unsigned places) {
    self.value *= std::pow(10, places);
    return self;
}

myclass& operator>>=(myclass &self, unsigned places) {
    self.value /= std::pow(10, places);
    return self;
}

// create a new instance and return it by value
myclass operator<<(myclass const &original, unsigned places) {
    myclass temp(original);
    temp <<= places;
    return temp;
}

myclass operator>>(myclass const &original, unsigned places) {
    myclass temp(original);
    temp >>= places;
    return temp;
}

并使用如下:

int main() {
    myclass a = {0.1};
    std::cout << "a := " << a.value << '\n';

    myclass b = a << 1;
    std::cout << "b = (a << 1) := " << b.value << '\n';

    b >>= 1;
    std::cout << "b >>= 1 := " << b.value << '\n';
}
于 2013-04-18T13:46:43.563 回答
3

你可能想要这个:

myclass myclass::operator<<(int digits) const { 
    myclass result;
    result.value = this->value * pow(10, digits);
    return result;
}
myclass myclass::operator>>(int digits) const { 
    myclass result;
    result.value = this->value * pow(0.1, digits);
    return result;
}

这确保它this没有改变,所以你必须写

number = number << 3;

修改一个数字,所以写的时候

otherNumber = number << 3;

number正如您在对该问题的评论中所要求的那样,这保持不变。签名中的const告诉使用此运算符的代码左侧操作数保持不变。

通常,您还有直接对目标对象进行操作的运算符,这些运算符也包含=在其中。从技术上讲,它们与其对应的非赋值运算符无关,因此您应该相应地定义它们以保持一致性:

myclass & myclass::operator<<=(int digits) {
    this->value *= pow(10, digits);
    return *this;
}
myclass & myclass::operator>>=(int digits) {
    this->value *= pow(0.1, digits);
    return *this;
}
于 2013-04-18T13:23:45.227 回答
2

据推测,“小数移位”意味着将小数点左移(右,for operator>>)指定的位数。

在这种情况下,您可能希望参数是无符号整数:

myclass &myclass::operator<<(unsigned digits) { 
     value *= pow(10, digits);
     return *this;
}
于 2013-04-18T13:21:19.620 回答