Next: C++ Interface Integers, Previous: C++ Class Interface, Up: C++ Class Interface [Index]
C++クラスと関数を使うときには必ず下記のようにヘッダファイルを使って下さい。
#include <gmpxx.h>
C++プログラムはlibgmpxxとlibgmpを下記のように必ずリンクして下さい。
g++ mycxxprog.cc -lgmpxx -lgmp
定義済みクラスは下記の3つです。
標準的な演算子や関数群はこの定義済みクラスを用いてオーバーロードされており,下記のような使い方ができます。
int main (void) { mpz_class a, b, c; a = 1234; b = "-5678"; c = a+b; cout << "sum is " << c << "\n"; cout << "absolute value is " << abs(c) << "\n"; return 0; }
a=b+c
のような式の場合,対応する演算関数であるmpz_add
を一度だけ呼びだせばよく,b+c
の部分では一時変数は不要です。しかし,a=b*c+d*e
のように一時変数を使わざるを得ない式の場合もあります。
普通のデータ型であるlong
, unsigned long
,double
と同様に,GMPの定義済みクラスは自由に混ぜて式に利用して構いません。int
やfloat
のように短い長さのデータ型も利用でき,これらは対応する長いデータ型に変換されて使われます。
bool
型を直接使うことはできませんので,最初にint
型に明示的に変換しておく必要があります。C++は自動的にすべてのポインタはbool
型に自動的に変換されるので,GMPがbool
型を受け付けてしまうと,不正なクラスやポインタのあらゆる組み合わせもコンパイルできてしまい,型に応じた変換操作ができなくなります。
GMPの定義済みクラスから通常のC++データ型への変換は自動的には行えません。get_si
メンバ関数を利用するようにして下さい(詳細は以降の節を参照)。
同様に,クラスをGMPのCのデータ型に自動的に変換することもできません。下記のCデータ型オブジェクトへの参照を返す下記の関数を使って下さい。
上記の関数はC++クラスが使えないCの関数を使うために用意されています。例えばa
に対してb
とc
のGCDを代入するには次のように上記の関数を使います。
mpz_class a, b, c; ... mpz_gcd (a.get_mpz_t(), b.get_mpz_t(), c.get_mpz_t());
他のやり方としては,定義済みクラスを対応するGMPのCデータ型として初期化,あるいはコンストラクタを明示的に呼び出して割り当てる,というものがあります。どちらの場合でも後腐れが生じないよう,値のコピーが作られます。次のように使えます。
mpz_t z; // ... zを初期化して計算する ... mpz_class x(z); mpz_class y; y = mpz_class (z);
gmpxx.hでは名前空間を定義しません。すべてのデータはそのままグローバル名前空間に放置されます。この流儀はgmp.hから発しており,互換性を保つための仕様です。gmpxx.hのその他の機能はGMPの名前変換(naming conversion)を保管しており,名前の衝突が起きないようにしています。