Next: , Previous: , Up: C++ Class Interface   [Index]


12.1 C++インターフェースの概要

C++クラスと関数を使うときには必ず下記のようにヘッダファイルを使って下さい。

#include <gmpxx.h>

C++プログラムはlibgmpxxlibgmpを下記のように必ずリンクして下さい。

g++ mycxxprog.cc -lgmpxx -lgmp

定義済みクラスは下記の3つです。

Class: mpz_class
Class: mpq_class
Class: mpf_class

標準的な演算子や関数群はこの定義済みクラスを用いてオーバーロードされており,下記のような使い方ができます。

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 longdoubleと同様に,GMPの定義済みクラスは自由に混ぜて式に利用して構いません。intfloatのように短い長さのデータ型も利用でき,これらは対応する長いデータ型に変換されて使われます。

bool型を直接使うことはできませんので,最初にint型に明示的に変換しておく必要があります。C++は自動的にすべてのポインタはbool型に自動的に変換されるので,GMPがbool型を受け付けてしまうと,不正なクラスやポインタのあらゆる組み合わせもコンパイルできてしまい,型に応じた変換操作ができなくなります。

GMPの定義済みクラスから通常のC++データ型への変換は自動的には行えません。get_siメンバ関数を利用するようにして下さい(詳細は以降の節を参照)。

同様に,クラスをGMPのCのデータ型に自動的に変換することもできません。下記のCデータ型オブジェクトへの参照を返す下記の関数を使って下さい。

Function: mpz_t mpz_class::get_mpz_t ()
Function: mpq_t mpq_class::get_mpq_t ()
Function: mpf_t mpf_class::get_mpf_t ()

上記の関数はC++クラスが使えないCの関数を使うために用意されています。例えばaに対してbcの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)を保管しており,名前の衝突が起きないようにしています。