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

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() が必要です。p1p2RWCollectable オブジェクトへのポインタとすると、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 shorttypedef されたもの) を返します。デフォルトの定義では、__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」という項目を参照してください。