Tools.h++ 7.0 クラスライブラリ・リファレンスマニュアル: RWCollectable

バナーをクリックすれば目次に戻ります

Copyright 1999 Rogue Wave Software
Copyright 1999 Sun Microsystems, Inc.

## RWCollectable

### 形式

      typedef RWCollectable Object;  // Smalltalk typedef
      #include <rw/collect.h>

### 説明

  クラス RWCollectable は、コレクタブルなオブジェクトの抽象基底クラスです。このクラスには、コレクタブルなオブジェクトの識別、ハッシュ、比較、格納、取り出しを行う仮想関数があります。これらの仮想関数のデフォルトの定義は単純ですが、この基底クラスを継承するオブジェクトでは通常、これらの関数の 1 つまたは複数が再定義されます。

### 持続性

  多相

### 仮想関数

      virtual
      ~RWCollectable();

    クラス RWCollectable を継承する関数はすべて仮想デストラクタを持っています。したがって、クラスの型を知らなくても `removeAndDestroy()` などのメンバー関数を使用すれば、それらのクラスを削除できます。

      virtual RWspace
      binaryStoreSize() const;

    オブジェクトを格納するために仮想関数 `saveGuts(RWFile&)` が使用するバイト数を返します。この値は通常、すべての基本型を格納するのに必要な領域のサイズに、RWCollectable を継承する全オブジェクトの領域を確保するため `recursiveStoreSize()` を呼び出した結果を加えたものとなっています。詳細は、『Tools.h++ 7.0 ユーザーズガイド』の「Virtual Function binaryStoreSize」を参照してください。

      virtual int
      compareTo(const RWCollectable*) const;

    コレクション内の項目をソートするには、この関数 `compareTo()` が必要です。`p1` と `p2` が RWCollectable オブジェクトへのポインタとすると、`p1->compareTo(p2)` という文は次のような結果になります。

      `0` | `*p1` が `*p2` と等しい場合
      `>0` | `*p1` が `*p2` より大きい場合
      `<0` | `*p1` が `*P2` より小さい場合

    "等しい"、"大きい"、"小さい" の意味はユーザーに任されているので注意してください。この基底クラスでのデフォルトの定義は、アドレスによって決まります。つまり、次のようになります。

      return this == p2 ? 0 : (this > p2 ? 1 : -1);

    この定義はそれほど有用なものではありません。

      virtual unsigned
      hash() const;

    ハッシュ値を返します。この関数は、ハッシュ表を参照するコレクションクラスには必要です。基底クラスから渡されるデフォルトの定義では、次のようにオブジェクトのアドレスでハッシュします。

      return (unsigned)this;

    `isEqual()` に `TRUE` を返すすべてのオブジェクトは、ハッシュ値が同じになることが重要です。

      virtual RWClassID
      isA() const;

    クラス識別番号 (`unsigned short` に `typedef` されたもの) を返します。デフォルトの定義では、`__RWCOLLECTABLE` を返します。0x8000 (16 進数) 以上の識別番号は Rogue Wave オブジェクト用に予約されていますので、ユーザー定義クラスでは 0 〜 0x7FFF の数を返すよう `isA()` を定義しなければなりません。

      virtual RWBoolean
      isEqual(const RWCollectable* t) const;

    コレクタブルなオブジェクトがアドレス `t` のオブジェクトと "一致" したら `TRUE` を返します。デフォルト定義は次のようになります。

      return this == t;

    つまり、両方のオブジェクトが同じアドレスを持つときに `TRUE` を返します (同一性テスト)。この定義は、整合性がある様々な方法で、再定義可能です。

      virtual RWCollectable*
      newSpecies() const;

    自分自身と同じ型のヒープから新しいオブジェクトを割り当て、そのポインタを返します。作業終了後は、ユーザーがそのオブジェクトを削除しなければなりません。

      virtual void
      restoreGuts(RWFile&);

    クラス RWFile を使用してバイナリファイルからオブジェクトの状態を読み取り、前の状態を置き換えます。

      virtual void
      restoreGuts(RWvistream&);

    入力ストリームからオブジェクトの状態を読み取り、前の状態を置き換えます。

      virtual void
      saveGuts(RWFile&) const;

    クラス RWFile を使用して、オブジェクトの状態をバイナリファイルに書き込みます。

      virtual void
      saveGuts(RWvostream&) const;

    オブジェクトの状態を出力ストリームに書き込みます。

      RWStringID
      stringID();

    クラスの識別文字列を返します。実際には異なりますが、仮想関数として動作します。1

      RWspace
      recursiveStoreSize() const;

    次の大域演算子を使用してオブジェクトを格納するのに必要なバイト数を返します。

      `RWFile& operator<<(RWFile&, const RWCollectable&);`

    再帰的に `binaryStoreSize()` を呼び出し、重複オブジェクトを処理します。

### 静的公開メンバー関数

      static RWClassID
      classID(const RWStringID& name);

    大域 RWFactory の中で `name` に関連付けられている `RWClassID` を検索した結果を返します。

      static RWClassID
      classIsA();

    このクラスの `RWClassID` を返します。

      static RWBoolean
      isAtom(RWClassID id);

    `id` が、プログラマーが選択した RWStringID を持つ RWCollectable に関連付けられた RWClassID である場合、`TRUE` を返します。

      static RWspace
      nilStoreSize();

    `rwnil` ポインタを RWFile に格納するのに必要なバイト数を返します。

### 関連の大域演算子

      RWvostream&
      operator<<(RWvostream&, const RWCollectable& obj);
      RWFile&
      operator<<(RWFile&,     const RWCollectable& obj);

    オブジェクト `obj` を、仮想ストリームまたは RWFile に保存します。再帰的に仮想関数 `saveGuts()`を呼び出し、重複オブジェクトを処理します。詳細は、『Tools.h++ 7.0 ユーザーズガイド』の「持続性」という項目を参照してください。

      RWvistream&
      operator>>(RWvistream&, RWCollectable& obj);
      RWFile&
      operator>>(RWFile&,     RWCollectable& obj);

    RWCollectable から継承したオブジェクトを、仮想ストリームまたは RWFile から `obj` に復元し、`obj` の前の内容を書き換えます。再帰的に仮想関数 `restoreGuts()` を呼び出し、重複オブジェクトを処理します。詳細は、『Tools.h++ 7.0 ユーザーズガイド』の「持続性」を参照してください。発生する可能性のあるエラーの型は、RWInternalErr (RWFactory がオブジェクトの作成方法を知らない) と RWExternalErr (ストリームやファイルの破壊) です。

      RWvistream&
      operator>>(RWvistream&, RWCollectable*& obj);
      RWFile&
      operator>>(RWFile&,     RWCollectable*& obj);

    入力ストリームまたは RWFile 上の次のオブジェクトについて、ヒープから適切な型の新しいオブジェクトを作成してそのポインタを返すか、またはすでに読み込まれているインスタンスへのポインタを返します。再帰的に仮想関数 `restoreGuts()` を呼び出し、重複オブジェクトを処理します。オブジェクトをヒープから作成した場合、後でそれを削除する必要があります。詳細は、『Tools.h++ 7.0 ユーザーズガイド』の「持続性」という項目を参照してください。発生する可能性のあるエラーの型は、RWInternalErr (RWFactory がオブジェクトの作成方法を知らない) と RWExternalErr (ストリームやファイルの破壊) です。この呼び出しの間に例外が送出された場合、部分的に復元されたオブジェクトへのポインタはおそらく失われ、メモリーのリークが発生します。この理由から、上記に示した静的メソッド `tryRecursiveRestore()` を使用するようにしてください。

  1 仮想関数ではない関数を仮想関数として動作させる方法の詳細は、ユーザーズガイドの「RWString」という項目を参照してください。