-1

<< および >> 演算子をオーバーロードして 10 進シフトを実行しようとしていますが、その方法がわかりません。たとえば、クラス 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

operator>>おそらく、「10 進シフト」とは、指定された桁数だけ小数点を左 (右) にシフトすることを意味します。

この場合、おそらくパラメーターを unsigned int にする必要があります。

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