0

オブジェクトをテストして、特定のメンバーがあるかどうかを確認するにはどうすればよいでしょうか? または、オブジェクトが特定のクラスのインスタンスであるかどうかを確認する方法はありますか?

私はキャラクター画像の継承構造を扱っています。String_Pics、HCat_Pics、VCat_Pics、および Frame_Pics があります。それらはすべて Pic_Base から派生します。ユーザーは、オブジェクトへのスマート ポインターを含むハンドル クラス "Picture" を使用します。各オブジェクトは、元になる画像 (別の画像のフレーム、水平に連結された 2 つの画像など) へのポインターを格納します。

例: VCat-Pic の周りに Frame-Pic があり、VCat-Pic 内の両方の写真が String_Pic の周りに Frame_Pic です。

***************
*             *
* *********** *
* * This    * *
* * is      * *
* *********** *
* *********** *
* * The     * *
* * Example * *
* *********** *
*             *
***************

Frame_Pics には「フレーム文字」のデータ メンバがありますが、他のクラスにはありません。構造内のすべてのフレームのフレーム文字を再帰的に変更する関数を作成しています。そうでなければこれを行う方法が欠けているかもしれませんが、扱っているオブジェクトが Frame_Pic であるかどうかをテストする方法を探しています。 .

私の最初の本能はif (p->frame_char)、frame_char が Frame_Pic のデータ メンバーの 1 つの名前であるようなものを試すことでしたが、これを行う方法がわかりません。

4

2 に答える 2

2

ポインターを a に動的にキャストして、Frame_picnull 以外が返されるかどうかを確認できます。

Frame_Pic *frame =dynamic_cast<Frame_Pic*>(p);
if(frame  != nullptr){
    //It is Frame_Pic
    frame->frame_char;
}

ただし、このまま行くのは得策ではありませんcast。その必要性をなくす仮想関数を作成してみてください。

于 2013-01-16T02:39:06.210 に答える
1

メンバーシップを直接テストする必要はまったくないことがわかりました。これは、実際にはポリモーフィズムに適した問題でした。

virtualPic_Base で関数 "reframe"を宣言し、文字を変更する "frame" のバージョンと、必要に応じてネストされた画像を再帰する他のクラスのバージョンを定義しました。

于 2013-01-16T04:05:37.023 に答える