bate's blog

調べたこと実装したことなどを取りとめもなく書きます。

結局C/C++

C/C++で書くことにしました。

Effective C++ 第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTI)

Effective C++ 第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTI)


分数計算の所から書いています。
テンプレートを使うのは初めてです。

	// 演算子
	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;
}