2013-02-20 2 views
1

예 : 이런 내가 C를 정의 ++ 클래스 : 나중에ctags를 사용하여 C++ 클래스 인스턴스를 얻으려면 어떻게해야합니까?

class cat : public animal 
{ 
    public: 
    cat(const char* nameString) : m_name(nameString) {} 
    ~cat(){} 
    const char* getName() {return m_name.c_str();} 

private: 
    std::string m_name; 
}; 

: ctags 나에게 상속, 회원, 방법, 액세스 유형 (공공, 민간) 등을 말할 수 위의 예제 코드에 대한

cat kitty("Garfield"); 
printf("%s", kitty.getName()); 

,

하지만 키티가 고양이의 인스턴스라는 것을 어떻게 알 수 있습니까?

+0

std :: type_info가 도움이 될까요? – qPCR4vir

+1

사람들이 잘못된 질문에 답하는 것처럼 보입니다. 내가 이해하는 한,이 질문은 런타임에 유형 정보를 판별하는 것이 아닙니다. 문제는 [ctags] (http://ctags.sourceforge.net/)가 인스턴스 'kitty'의 유형을 식별하는 것입니다. @ ruben2020 : 그게 맞습니까? – Void

+0

예, 이것은 ctags 사용에 관한 것입니다. – ruben2020

답변

1
std::cout << "kitty is a: " << typeid(kitty).name() << '\n'; 

그러나 see처럼 정확하게 원하는 것은 아닐 수 있습니다.

유형 이름이 들어있는 구현 정의 Null 종료 문자열 을 리턴합니다. 보장이 없으므로 에서 특히 반환되는 문자열은 여러 유형에서 동일 할 수 있으며 동일한 프로그램의 호출간에 이 변경 될 수 있습니다.

당신은 다른과 typeidcompare 수는 cat 같은 유형을 알고있다.

그리고 당신은 객체 이름이 같은 방향/스타일을 만들고, Animal에서 가상 함수를 포함 할 수 있습니다 : 이제

string whatAnimal()const override {return "cat";} 

:

virtual string whatAnimal()const{return "animal";} 

과의 파생 클래스를 코드에서 사용하는 이름 규칙과 관련이없는 각 유형에 대한 문자열을 완벽하게 제어 할 수 있습니다.

+0

이 정보를 얻기 위해 어떻게 ctags를 사용할 수 있습니까? – ruben2020

0

typeid를 사용하여 개체의 클래스 이름을 가져올 수 있습니다. 그러나 컴파일러는 이름을 채워 넣기 때문에 런타임에 적절하게 해제해야합니다.

예 :

#include <iostream> 
#include <cxxabi.h> 

class cls {}; 

void main(){ 
    cls obj; 
    int status; 
    char * demangled_name = abi::__cxa_demangle(typeid(obj).name(),0,0,&status); 
    std::cout << demangled_name << std::endl; 
    free(demangled_name); 
    return; 
} 

출력됩니다 :

cls 
+0

나는이 정보를 얻기 위해 어떻게 ctags를 사용할 수 있습니까? – ruben2020

0

직접 키티 고양이의 인스턴스가이 방법으로 수행 할 수 있는지 확인하는 방법에 대한 귀하의 질문에 대답 :

if(typeid(cat) == typeid(kitty)) 
    // do something if kitty is a cat 

참고 : typeid(YourClass).name()nYourClass을 반환합니다. 여기서 n은 cla의 길이입니다. ss 이름.

+0

이 정보를 얻기 위해 어떻게 ctags를 사용할 수 있습니까? – ruben2020