LoginSignup
0
1

More than 5 years have passed since last update.

C++ Builder 10.2 Tokyo > FindComponent()した結果をTEdit *に入れる場合 > dynamic_cast<TEdit *>と(TEdit *)キャストの違い

Last updated at Posted at 2018-05-24
動作環境
RAD Studio 10.2 Tokyo Update 3
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)

疑問

下記のコンポーネントがあるとする。

  • Edit1: TEdit
  • CheckBox1: TCheckBox

TEdit *edPtrにFindComponent()の結果を代入するとき、下記の違いはあるのか?

  1. dynamic_cast<TEdit *>
  2. (TEdit *)キャスト

code

Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TEdit *edPtr;
    String msg = L"";

    // 1. dynamic_cast
    edPtr = dynamic_cast<TEdit*>(FindComponent("Edit1"));
    if (edPtr != NULL) {
        msg += L"1a: Edit1(dynamic_cast): Exist\r\n";
    }

    edPtr = dynamic_cast<TEdit*>(FindComponent("CheckBox1"));
    if (edPtr != NULL) {
        msg += L"1b: CheckBox1(dynamic_cast): Exist\r\n";
    }

    // 2. TEdit * cast
    edPtr = (TEdit *)(FindComponent("Edit1"));
    if (edPtr != NULL) {
        msg += L"2a: Edit1(TEdit * cast): Exist\r\n";
    }

    edPtr = (TEdit *)(FindComponent("CheckBox1"));
    if (edPtr != NULL) {
        msg += L"2b: CheckBox1(TEdit * cast): Exist\r\n";
    }

    ShowMessage(msg.c_str());

}
//---------------------------------------------------------------------------

結果

qiita.png

考察

  • dynamic_cast<TEdit *>の場合、異なる型のコンポーネントはNULLを返す
  • (TEdit *)の場合、異なる型のコンポーネントはNULLにならない。

型間違いの防止にはdynamic_cast<TEdit *>の方がいい。
一方で、下記の意見があることは付記しておく。

この dynamic_cast は安全にキャストしてくれるいいものなのですが、 「dynamic_cast は使うな」と言われています。

関連

使い分け

c++ builder XE4, 10.2 Tokyo > 格子状配置のTCheckBoxのCheckedを行列で取得する > Tagプロパティの使用
においては下記のようにしている (code v0.2のUnit1.cpp)。

  1. dynamic_cast<>にてコンポーネントがあることを確認
  2. (TCheckBox *)にてsrcPtrへ代入

この流れとdynamic_cast<>での代入の違いは何か。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1