C++ Builder 10.2 Tokyo > FindComponent()한 결과를 TEdit *에 넣는 경우 > dynamic_cast와 (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



    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());
    
    }
    //---------------------------------------------------------------------------
    

    결과





    고찰


  • dynamic_cast<TEdit *>의 경우, 다른 형태의 컴퍼넌트는 NULL를 돌려줍니다.
  • (TEdit *)의 경우, 다른 형태의 컴퍼넌트는 NULL가 되지 않는다.

  • 형 실수의 방지에는 dynamic_cast<TEdit *> 쪽이 좋다.
    한편, 하기의 의견이 있는 것은 부기해 둔다.


    이 dynamic_cast 는 안전하게 캐스트 해 주는 좋은 것입니다만, 「dynamic_cast 는 사용하지 말아라」라고 말해지고 있습니다.

    관련


  • dynamic_cast 사용 기사 (7of9)

  • 구분



    c ++ 빌더 XE4, 10.2 Tokyo
    에 있어서는 다음과 같이 하고 있다(code v0.2의 Unit1.cpp).
  • dynamic_cast<>에서 구성 요소가 있는지 확인
  • (TCheckBox *)에서 srcPtr에 할당

  • 이 흐름과 dynamic_cast<> 에서의 대입의 차이는 무엇인가.

    좋은 웹페이지 즐겨찾기