2012-01-04 2 views
-1

저는 학습 언어 C++ (1 년 전)를 시작했습니다. 왜냐하면 그것은 대부분 언어가 아닌 언어이기 때문에 거의 모든 것이 가능하기 때문입니다. 우리가 객체 (클래스) 안에 몇 가지 코드를 작성하는 예를 들어 우리는 어떻게 든 그것의 이름을 알아낼 필요 : 하지만 한 가지 그렇게하지C++에서 개체 또는 변수의 식별자 및 식별자를 확인 하시겠습니까?

class Test 
{ 
public: const char* getMyIdentiferName() 
      { 
       // what now?? 
      } 
}; 

물론 가장 좋은 방법은 '이'를 사용하는 것입니다 keywod하지만 그건 '이'캔트 리턴 이름 때문에 도움이되지 않을까요?

Test thatsMyName; 
const char* = thtsMyName.getMyIdentiferName(); //return string "thatsMyName" how? 

어떻게하면 일반 기능이나 심지어 템플릿에서 'thatsMyName'문자열을 얻을 수 있습니까 ??

또 다른 예 :

어떻게 우리가 어떤 클래스의 유형 ID를받을 수 있나요 (너무이 답변하시기 바랍니다)? 많이

class MyType 
{ 
public: type_info getType() 
    { 
      return typeid(this); //that wont work of course :) 
    { 
}; 

당신의 비슷한 작업을 실현하려 방법에 대한 몇 가지 아이디어가있는 경우이 재미 보인다하지만 ...

감사합니다.

는 편집 : OK, everybodey는 개체의 이름을 가져 불가능 말, 나는 이름을 얻는 방법을 발견 :

class Test 
{ 
    public: string getObjectName() 
    { 
     string arg = typeid(*this).name(); 
     arg.erase(arg.begin(), arg.begin() + 5); 
     arg.erase(0,1); 
     return arg; 
    } 
}; 


int main() 
{ 
    Test thisIsMyName; 
    cout << thisIsMyName.getObjectName() << endl; 
    cin.ignore(); 
    return 0; 
} 

편집 : Fiktik에 큰 감사가 발견 내 두 번째 예제 응답 방법 oon 개체의 type_info 얻는 방법!

+0

'반환 유형 ID (이)'작동합니다. 왜 효과가 없을 것이라고 말하는가? 당신은 또한'return typeid (* this);를 고려해야한다. –

+0

감사합니다. 그리고 그 함수의 리턴 타입은 무엇이 될까요? – codekiddy

+0

대다수의 개체에는 이름이 없습니다. –

답변

3

가장 먼저 묻는 것은 불가능합니다. 적어도 직접적으로.

#define CREATE_VARIABLE(type, name) registerVariable<type>(#name); type name 

을하지만, 이것은 매우 복잡하고 모든 곳에서 사용할 수 없습니다

이 같은 변수 어딘가에 이름을 등록 할 것입니다 선언, 뭔가 매크로를 만들 수 있습니다. 왜이 기능을 원하십니까?

두 번째 것은 단지 약간의 조정 작업을해야합니다

class MyType 
{ 
public: 
    const type_info& getType() 
    { 
     return typeid(*this); 
    } 
}; 
+0

두 번째 예제에서는 임시 참조를 반환합니다. –

+0

@larsmans, 명백하게'typeid'는 "프로그램 끝까지 존재하는 std :: type_info 객체에 대한 참조"를 반환합니다. http://en.wikipedia.org/wiki/Typeid 따라서 안전합니다. 나는 단지 몇 분 전에 이것을 발견 했으므로 자신을 확인하십시오 :-) –

+0

제가 알고있는 한 (http://en.cppreference.com/w/cpp/language/typeid), typeid 연산자는 이미 전역 저장소가있는 type_info 객체에 대한 참조이므로이 코드는 괜찮을 것입니다 (const-correctness는 제외). – Fiktik

2

당신의 변수 이름을 무엇을해야 할 것인가? 당신이하려는 것은 불가능합니다. 클래스의 메서드 내에서 객체에 액세스하는 데 사용되는 변수의 이름을 알 수 없습니다.

Test * myTest = new Test(); 
Test * myTest2 = myTest; 
const char* identifier = myTest2->getMyIdentifierName(); 

getMyIdentifierName() 무엇을 반환해야합니다 :

이 예제를 고려? "myTest"? "myTest2"? 객체가 동적으로 할당 되었기 때문에 아무 것도 전혀 변수가 없으므로 실제로 객체를 "보유"한다고 주장 할 수는 없습니까?

현재 인 변수 이름을 알고 싶다면 객체를 참조하는 데을 사용해야합니다. 문자열 리터럴을 사용하고 필요에 따라 그것을 전달하지 않는 이유는 무엇입니까? 그러나 그것은 실제 응용에서 의미가없는 것처럼 보입니다.

런타임에 객체의 이름 (즉, 고유 식별자)이 필요한 경우 클래스에 구성원 name을 부여하고 필요한 모든 것을 초기화하는 것이 가장 좋습니다.

+0

감사, Acctualy 내가 그쪽으로 이름 (첫 번째 예제에서), 그것은 불가능한 것,하지만 내 질문에 또 다른 예제가 어떻게 든 가능해야합니다 왜 필요할지 모르겠다. 나는이 목적을 배우기 위해이 질문을한다. – codekiddy

+0

예제에서 Test 개체에는 이름이 전혀 없습니다. myTest 및 myTest2는이 인스턴스에 대한 포인터의 이름입니다. – visitor

+0

@visitor : 정확하게 내 포인트. 변수 명칭에서 객체 "이름"은 C++에서는 의미가 없습니다. – codeling

2

오브젝트의 고유 식별자가 없으므로 오브젝트의 "식별자 이름"을 얻는 것입니다 (주소는 &과 같음). 무제한 수의 참조/포인터는 동일한 객체를 지정할 수 있습니다. 동시에 언어는 식별자가 아닌 다른 방법으로 객체에 접근 할 수 있습니다. v[0] 여기서 v은 벡터이지만 식별자는 아닙니다. 이것은 내가 아는 모든 프로그래밍 언어의 경우이며, 그중 수십 가지를 알고 있습니다.

는 두 번째 질문에 관해서는, 당신은 std::type_info에 대한 참조를 반환 할 수 있습니다.

struct Test 
{ 
    // pretty useless method 
    std::type_info const &type() const { return typeid(*this); } 
}; 

int main() 
{ 
    Test a; 
    std::cout << a.type().name() << "\n"; 
} 
+0

'type_info'는 왜 복사 가능하지 않습니까? 해결 방법이 있습니까? 우리는 힙에 그것을 할당하고'unique_ptr' 또는'auto_ptr' 또는'shared_ptr'를 대신 전달할 수 있습니까? –

+0

내 의견에 답하기 위해 [Wikipedia] (http://en.wikipedia.org/wiki/Typeid)에서 type_info에 대한 포인터를 안전하게 반환 할 수 있다는 인상을받습니다. "이것은 프로그램의 끝까지 존재하는 std :: type_info 객체에 대한 참조를 반환합니다 [1]" –

+0

참조 또는 포인터를'std :: type_info'로 반환 할 수 있습니다. C++ 11에 접근 할 수 있다면'std :: type_index' ('std :: type_info const *'에 대한 래퍼)를 반환 할 수 있습니다. –

관련 문제