2013-01-16 3 views
0

개체에 특정 구성원이 있는지 확인하려면 어떻게 테스트합니까? 아니면 개체가 특정 클래스의 인스턴스인지 확인하는 방법이 있습니까?C++ 클래스가 멤버인지 여부를 테스트하는 방법은 무엇입니까?

저는 문자 - 그림의 상속 구조로 작업하고 있습니다. String_Pics, HCat_Pics, VCat_Pics 및 Frame_Pics가 있습니다. 그들은 모두 Pic_Base에서 파생됩니다. 사용자는 객체에 대한 스마트 포인터를 포함하는 "Picture"핸들 클래스를 사용합니다. 각 객체는 기반으로하는 그림 (다른 그림의 프레임, 수평으로 연결된 두 그림 등)에 대한 포인터를 저장합니다.

예 : VCat-Pic 주변의 프레임 -pic이며 VCat-Pic의 두 그림은 모두 String_Pics 주위의 Frame_Pics입니다.

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

프레임 픽스에는 "프레임 문자"에 대한 데이터 멤버가 있지만 다른 클래스는 없습니다. 구조의 모든 프레임에 대해 프레임 문자를 재귀 적으로 변경하는 함수를 작성하고 있습니다. 어쩌면 나는 그렇지 않으면 할 방법이 없는데, 내가 다루는 객체가 Frame_Pic인지 아닌지를 테스트하는 방법을 찾고 있는데, 프레임의 문자를 변경하려고 시도 할 것인지 아닌지 여부 .

내 첫 번째 본능은 if (p->frame_char)과 같은 것을 시도하는 것이 었습니다. 여기서 frame_char은 Frame_Pic의 데이터 멤버 중 하나의 이름이지만이 작업을 수행하는 방법을 모르겠습니다.

+0

이것은 여러 번 전에 물어 보았습니다. 여기에 아름다운 해결책이있는 예가 있습니다. http://stackoverflow.com/questions/257288/is-it-possible-to-write-ac-template-to-check-check- for-a-functions-existence –

+1

@AdamCadien 컴파일 타임 솔루션이라고 생각합니까? OP가 런타임을 필요로하는 것처럼 보입니다. –

+0

그래, 나쁘다! 그 점을 지적 해 주셔서 감사합니다. –

답변

2

포인터를 Frame_pic에 동적으로 캐스팅하고 null이 아닌 값을 반환하는지 확인할 수 있습니다.

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

안 좋은 생각

는 .. 비록 cast 길을 갈 멀리에 대한 필요성과 함께 할 가상 함수를 작성하려고합니다.

+0

그래, 가상 기능이 갈 길이었다. –

+0

@AndyIsbell 디자인을 고칠 수 있다는 점이 좋습니다. –

1

실제로 회원 자격에 대한 직접 테스트를 수행 할 필요가 없습니다. 이것은 실제로 다형성에 적합한 문제였습니다.

Pic_Base에서 virtual 함수 "reframe"을 선언하고 "frame"의 버전을 정의하여 문자를 변경하고 다른 클래스가 재귀 적으로 통과하도록 정의했습니다. 필요에 따라 중첩 된 그림.