2013-07-24 5 views
3

나는 (런타임에) C++ 프로그램의 각 변수에 대해 고유 한 이름을 가져올 수 있는지 알고 싶습니다. 는 예를 들어, 메인에서 나는 C++ : 변수의 경로를 얻는 방법?

MyClass A; 

를 선언 MyClass의에서 나는

int I; 

내가 "주/A/I"와 같은 뭔가를 반환 마법의 제조법을하고 싶습니다 선언합니다.

이와 비슷한 것이 있습니까?

감사합니다.


이것의 목적은 가변 할당을 추적한다. 표준 데이터 형식의 래퍼로 사용하는 클래스를 작성했습니다. 이 클래스의 생성자는 문자열을 받아 각 변수를 식별합니다.

변수가 클래스에 선언되어 있고이 클래스의 인스턴스가 여러 개 있으면 문제가 발생합니다. 즉,

class MyClass { 
... 
MyInt data ("variable_name"); // MyInt is the wrapper for int 
... 
}; 

... 

int main() { 
... 
MyClass a; 
MyClass b; 
... 
} 

는 정적으로 불가능 a.data 및 b.data 사이 dintinguish 할 수 있도록 할 데이터의 이름을 초기화. 누군가 제안했듯이 메모리 주소를 ID로 사용할 수는 있지만 사람이 읽을 수있는 경로에 주소를 매핑하는 것이 어떻게 가능합니까?

+7

어떤 문제 당신은 실제로 해결하기 위해 노력하고있다? – Henrik

+0

이 부분의 중요한 점은 무엇입니까? – Rapptz

+0

아니요,이 같은 것이 존재하지 않습니다 (핵심어로). –

답변

1

(데이터 구조를 선언 할 때) 몇 가지 추가 작업을 수행하지 않는다면 일반적으로 C++에서는 불가능합니다. 이러한 데이터는 프로그램의 어느 곳에도 저장되지 않습니다.

참으로, 주석 기자 중 한 명으로, 플랫폼에 따라 디버깅 데이터 (예 : Windows에서 pdb)가있는 경우 디버거처럼 할 수 있습니다.

0

당신이 묘사하는 의미에서 절대적으로 아닙니다. 원하는 것은 들리는데, 전체 상속 계층 구조로 식별되는 변수를 갖는 것입니다.이 상속 계층은 참조 사이트가있는 것이며이 정보를 프로그램에 포함 시키면 중요한 성능 문제가 추가됩니다.

고유 식별자를 사용하여 프로그램에서 모든 변수를 식별 가능하고 전역으로 만들려면이 점을 심각하게 생각해보십시오. 연습을 언급하지 않는 것은 매우 나쁜 디자인이며 많은, 많은, 귀찮은 버그로 이어질 것입니다.

그러나, 이것은 당신이 요구하는지 수 있습니다 : "나는 특정 프로그램 X의 내 변수 클래스 구조를 나열 할 수 있습니다"

하실 수 있습니다. 그러나 그것은 당신이 원하는 것보다 더 많은 일이 될 수 있습니다. C++에는 그런 것들이 내장되어 있지 않습니다. 그러나 어딘가에 존재할 수도 있습니다. 그러나 모르면 모르겠습니다. 이렇게하려면 파서가 구문 분석 트리로 코드를 구문 분석하고 방문자 패턴을 사용하여 트리를 가로 지르며 각 변수에 부모 잎이 추가 된 상태로 출력됩니다. 이것은 디버거를 통해 볼 수있는 정보입니다 (변수는 아니지만 모든 컴파일러는 파스 트리를 구문 분석하고 구문 분석 트리를 구성합니다). 디버거가 런타임을 통해 빌드 할 때 저장하므로 사용자는이를 통해 "워크백"할 수 있습니다. 실제로 프로그램 파싱 트리를 다시 걷고 있습니다.당신이 무엇을 달성하고자하는 확신

0

아니, 내 지식에 따라 자신의 기능을 쓸 필요가 당신에게 세부 사항을 제공합니다 더 C++ 기능이없는, 나는 몇 가지 코드를 제공하고, 모르는 그것은 도움이 될 것입니다 여부 :

class MyClass 
{ 
     public: 
     MyClass(int z) : i(z) 
     { 
     } 
     const char* getType() 
     { 
      return typeid(i).name(); 
     } 
    private: 
     int i; 
}; 

class MyClassDerived:public MyClass 
{ 
    public: 
     MyClassDerived(int k):MyClass(k) 
     {   
     } 
}; 

int main() 
{ 
    MyClass *m = new MyClass(10); 
    cout<< typeid(*m).name() << "/" << m->getType()<< endl; 

    MyClassDerived *m1 = new MyClassDerived(20); 
    cout<< typeid(*m1).name() << "/" << m1->getType(); 
    return 0; 
} 

` 아웃 된 풋이 될 것입니다 :

7 MyClass에가/내가 14 MyClassDerived는/내가

이 문제가 해결되는지 알려주세요.