C++ Builder 10.2 Tokyo > FindComponent()した結果をTEdit *に入れる場合 > dynamic_cast<TEdit *>と(TEdit *)キャストの違い
RAD Studio 10.2 Tokyo Update 3
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
疑問
下記のコンポーネントがあるとする。
- Edit1: TEdit
- CheckBox1: TCheckBox
TEdit *edPtrにFindComponent()の結果を代入するとき、下記の違いはあるのか?
dynamic_cast<TEdit *>
-
(TEdit *)
キャスト
code
//---------------------------------------------------------------------------
#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());
}
//---------------------------------------------------------------------------
結果
考察
-
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)。
-
dynamic_cast<>
にてコンポーネントがあることを確認 - (TCheckBox *)にてsrcPtrへ代入
この流れとdynamic_cast<>
での代入の違いは何か。
Author And Source
この問題について(C++ Builder 10.2 Tokyo > FindComponent()した結果をTEdit *に入れる場合 > dynamic_cast<TEdit *>と(TEdit *)キャストの違い), 我々は、より多くの情報をここで見つけました https://qiita.com/7of9/items/1f9721196550faeea813著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .