結局C/C++
C/C++で書くことにしました。
Effective C++ 第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTI)
- 作者: スコットメイヤーズ,小林健一郎
- 出版社/メーカー: 丸善出版
- 発売日: 2014/03/18
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
分数計算の所から書いています。
テンプレートを使うのは初めてです。
// 演算子 TFriction<T>& operator=( TFriction<T> t ) { m_numerator = t.GetNumerator(); m_denominator = t.GetDenominator(); m_sign = t.GetSign(); return *this; }
上記のような書き方は駄目だったような覚えが・・・
#include <iostream> using namespace std; // 分数 template <class T> class TFriction { private: T m_numerator; // 分子 T m_denominator; // 分母 bool m_sign; // 符号 public: TFriction( T nu=0, T de=1 ) : m_numerator( nu ), m_denominator( de ), m_sign( 1 ) { } ~TFriction() { } T GetNumerator() { return m_numerator; } T GetDenominator() { return m_denominator; } bool GetSign() { return m_sign; } void Disp(); void Sign(); void Exec(); // 演算子 TFriction<T>& operator=( TFriction<T> t ) { m_numerator = t.GetNumerator(); m_denominator = t.GetDenominator(); m_sign = t.GetSign(); return *this; } TFriction<T> operator+( TFriction<T> t ) { this->Exec(); t.Exec(); return TFriction<T>( t.GetDenominator()*this->m_numerator + this->m_denominator*t.GetNumerator(), // 分子 this->m_denominator * t.GetDenominator() // 分母 ); } }; template<class T> void TFriction<T>::Sign() { int i = ( m_numerator < 0 ) ? 0 : 1; int j = ( m_denominator < 0 ) ? 0 : 1; m_sign = ( i ^ j ) ? 0 : 1; } template<class T> void TFriction<T>::Exec() { Sign(); // 符号を分子に if( m_denominator < 0 ) { m_numerator *= -1; m_denominator *= -1; } } template<class T> void TFriction<T>::Disp() { Exec(); /* if( m_sign ) cout << "+"; else cout << "-"; */ cout << m_numerator << "/" << m_denominator << endl; } int main() { TFriction<int> a(3,5), b( 3, -4 ), c; c = a + b; c.Disp(); return 0; }