Wide Studio Programmer's Guide

Wide Studio Home
Up to


特定のオブジェクトクラスのポインタを取得するには

特定のクラスのAPIにアクセスする場合、そのクラスのポインタでなければ なりません。従ってなんらかの形で、そのクラス型のポインタを取得していなければ なりません。ここではそのクラス型のポインタの取得の方法を説明します。
  • WSCbaseクラスの cast() メンバ関数による取得
    クラスポインタ取得API 機能
    void* WSCbase::cast(char* className) 指定されたクラス名のポインタを返値します。

WSCbase::cast() メンバ関数によるクラスポインタの取得を説明します。 object が WSCvtoggle クラスのオブジェクトであり、 トグルの選択状態を調べる、WSCvtoggle のメンバ関数 setStatus() にアクセスしたい場合の例です。
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 3.00

For Use with Wide Studio Release 3.00, Summper 2002


Wide Stuido Home | Up to

Copyright(C) T. Hirabayashi, 1999-2002 Last modified: June 10, 2002