特定のオブジェクトクラスのポインタを取得するには特定のクラスのAPIにアクセスする場合、そのクラスのポインタでなければ なりません。従ってなんらかの形で、そのクラス型のポインタを取得していなければ なりません。ここではそのクラス型のポインタの取得の方法を説明します。
C++言語では、通常、派生元へのキャストはできますが、 派生元から、派生クラスへのキャストはサポートされません。 WSCbase クラスの cast() 関数は、その機能を補います。
#include "WSCvtoggle.h" //WSCvtoggle クラスを直接アクセスするので。
...
void cbop(WSCbase* object){
//WSCvtoggle クラスの getStatus() 関数に対するアクセス(1)
WSCvtoggle* tgl = (WSCvtoggle*)object->cast("WSCvtoggle");
if (tgl == NULL){
//object は、WSCvtoggle クラスのインスタンスではなく、キャストに失敗。
}else{
//object は、WSCvtoggle クラスのインスタンスであり、キャストに成功。
WSCbool status = tgl->getStatus();
}
}
cast() 関数は、インスタンスが持つ、全ての継承クラスの
ポインタを取得することができます。しかし、継承継承に含まれない型を指定すると NULL が返されます。 この機能をうまく利用すると、 次のイベントプロシージャの様にクラスの判別に応用することが出来ます。
#include "WSCvbtn.h" //WSCvbtn クラスに直接アクセスするので。
#include "WSCvtoggle.h" //WSCvtoggle クラスに直接アクセスするので。
...
void cbop(WSCbase* object){
//WSCvbtn クラスを継承しているクラスのオブジェクトの判別
WSCvbtn* btn = (WSCvbtn*)object->cast("WSCvbtn");
//WSCvtoggle クラスを継承しているクラスのオブジェクトの判別
WSCvtoggle* toggle = (WSCvtoggle*)object->cast("WSCvtoggle");
if (btn == NULL){
//WSCvbtn クラスと全く関係のないクラスのオブジェクトである!
}else{
//WSCvbtn クラスであるかまたは、WSCvbtn クラスを継承している!
}
if (toggle == NULL){
//WSCvtoggle クラスと全く関係のないクラスのオブジェクトである!
}else{
//WSCvtoggle クラスであるかまたは、WSCvtoggle クラスを継承している!
}
}
異なるクラスの複数のオブジェクト/クラスにまたがって
利用するイベントプロシージャにおいて、クラスを判別するのに便利です。
Document Release 2.0 For Use with Wide Studio Release 2.0, Spring 2002
|