Operator overloadの練習として分数クラスを定義しました。
その結果を確かめるために、std::cout << "operator +: " << half << " + " << sixth << " = " << half + sixth << "\n";
のように書いていたのですが、+-*/
の4つしか違いがないのならvector
でまとめてループを回したほうが手っ取り早いと考えました。
ただ自分でcppreferenceで調べても検索結果が膨大だったために、operator
の型と入れる方法が分かりません。
どうすれば良いでしょうか?
class Fraction
についてご指摘があれば、そちらも教えていただけると幸いです。
よろしくお願いします。
C++
1#include <iostream> 2#include <numeric> 3#include <vector> 4#include <string> 5 6class Fraction { 7 int numerator_, denominator_; 8 9 void reduce() { 10 int factor = std::gcd(numerator_, denominator_); 11 numerator_ /= factor; 12 denominator_ /= factor; 13 } 14 15 public: 16 Fraction(int numerator, int denominator) : numerator_(numerator), denominator_(denominator) { 17 if (denominator_ < 0) { 18 numerator_ *= -1; 19 denominator_ *= -1; 20 } 21 reduce(); 22 } 23 24 friend std::ostream &operator<<(std::ostream &os, const Fraction &fraction) { 25 if (fraction.denominator_ != 1) { 26 os << fraction.numerator_ << "/" << fraction.denominator_; 27 } else { 28 os << fraction.numerator_; 29 } 30 return os; 31 } 32 33 friend Fraction operator+(Fraction first, Fraction second) { 34 auto numerator = (first.numerator_ * second.denominator_) + (second.numerator_ * first.denominator_); 35 auto denominator = first.denominator_ * second.denominator_; 36 return Fraction(numerator, denominator); 37 } 38 39 friend Fraction operator-(Fraction first, Fraction second) { 40 auto numerator = (first.numerator_ * second.denominator_) - (second.numerator_ * first.denominator_); 41 auto denominator = first.denominator_ * second.denominator_; 42 return Fraction(numerator, denominator); 43 } 44 45 friend Fraction operator*(Fraction first, Fraction second) { 46 auto numerator = first.numerator_ * second.numerator_; 47 auto denominator = first.denominator_ * second.denominator_; 48 return Fraction(numerator, denominator); 49 } 50 51 friend Fraction operator/(Fraction first, Fraction second) { 52 auto numerator = first.numerator_ * second.denominator_; 53 auto denominator = first.denominator_ * second.numerator_; 54 return Fraction(numerator, denominator); 55 } 56}; 57 58int main() { 59 Fraction half(5, 10); 60 Fraction sixth(6, 36); 61 62 std::cout << "operator +: " << half << " + " << sixth << " = " << half + sixth << "\n"; 63 std::cout << "operator -: " << half << " - " << sixth << " = " << half - sixth << "\n"; 64 std::cout << "operator *: " << half << " * " << sixth << " = " << half * sixth << "\n"; 65 std::cout << "operator /: " << half << " / " << sixth << " = " << half / sixth << "\n"; 66 67// 以下の正しいやり方が知りたい 68// std::vector<std::string> ops_str{"+", "-", "*", "/"}; 69// std::vector<std::operator> ops{operator+, operator-, operator*, operator/}; 70// for (int i = 0; i < 4; ++i) { 71// std::cout << "operator " << ops_str[i] << ": " << half << " " << ops_str[i] << " " << sixth << " = " << half ops[i] sixth << "\n"; 72// } 73}
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/02/21 06:22
2020/02/21 07:06 編集