2017-03-15 1 views
1

Handle in C에 대한 기사를 읽었을 때 우리가 void 포인터로 핸들을 구현한다는 것을 깨달았습니다. "무엇이든"Object/data 타입을 얻었습니다. 우리는 Object/데이터를 가져 와서 그 가치를 얻으십시오. 그래서 기본적으로 두 가지 문제가 있습니다 그에 21 인 값 HANDLE 점을 의미 하는가,Handle, Void Pointer, Objects in C++

설치 1. 우리는 기능 dosomething(21,2,2)에 값을 전달하면 Handle in C

typedef void* HANDLE; 
int doSomething(HANDLE s, int a, int b) { 
     Something* something = reinterpret_cast<Something*>(s); 
     return something->doit(a, b); 
    } 

에서 가져온 예를 다음에 말할 수를, 그렇다면 우리가 입력 할 때 어떤 객체가 그 객체에 어떻게 캐스트 될 것인가?이 예제에서와 같이 다른 객체에서 그것을 사용할 수 있습니까? Something something 객체의 포인터는 값 21을 저장합니다.

2.Secondly 링크도 "그래서 귀하의 코드에서 그냥 주위에 핸들을 전달 말한다 불투명 한 가치 "는 실제로 무엇을 의미합니까? 우리는 왜 "주변을 돌보는가"? 누군가가 위대 할 객체를 사용하는 핸들에 대해 더 설득력있는 예제를 줄 수 있다면!

+0

HANDLE이 가리키는 값이 21_ 아니요, 이는 s가 21임을 의미합니다. 나는 그 메모리 주소에서 흥미로운 것을 의심합니다. – bejado

+0

내가 틀렸을 수도 있지만 코드에서 다른 유형으로 s를 형 변환합니다. 실제 주소는 절대로 변하지 않습니다. – efekctive

답변

2

1 : 핸들은 객체의 식별자입니다. "21"은 객체가 아니며 단순히 숫자이므로 함수 호출이 유효하지 않습니다. 's'이 실제로 Something 유형의 구조체를 가리키는 경우에만 코드가 작동합니다. 간단히 말하면 포인터는 메모리 주소 이외의 포인터가 아니므로 "21"은 메모리 주소로 해석되어 쓰기를 시도하면 프로그램을 크래시합니다.

2 : "불투명 값 "는 코드를 사용하는 개발자가 핸들이 식별하는 객체의 내부 구조에 대한 어떠한 가정도 취할 수 없음을 의미합니다. 개발자가 구조를보고 코드를 변경 한 후에 더 이상 사실이 아닐 가정을 취할 수있는 구조체에 대한 포인터보다 이점입니다. "주위 패스"단순히 의미를 할당하고 같은 함수 호출 매개 변수로 사용에서 :

HANDLE s = CreateAnObject(); 
DoSomethingWithObject(s); 
HANDLE t = s; 

등의 방법으로

: 실제 코드에서는 다른 사용자 개체에 대한 핸들을 제공해야 EMPLOYEE_HANDLE, ORDER_HANDLE 등과 같은 이름입니다. 핸들의 일반적인 예는 Windows의 창 핸들입니다. 운영 체제의 "Window"메모리 구조가 어떻게 구성되는지에 대한 정보를 제공하지 않고 창을 식별하므로 Microsoft는 "Window"구조의 변경으로 다른 개발자 코드를 손상시킬 위험없이이 내부 구조를 변경할 수있었습니다. 우리는 함수 해봐요 (21,2,2)에 대한 값을 전달하는 경우

+0

글쎄요. 훌륭한 학습 자료! –

1

호는 단지 수단에 21 인 값 HANDLE 지점을 의미 않는다는 void* 값 21. 21을 Something 유형의 객체에 대한 포인터 값으로 처리하면 정의되지 않은 동작이 발생할 가능성이 큽니다.

2. 두 번째로 링크에서 "코드에서 사용자가 단순히 불투명 한 값으로 핸들을 전달합니다."실제로 의미하는 것은 무엇입니까? 우리는 왜 "주변을 돌보는가"? 누군가가 위대 할 객체를 사용하는 핸들에 대해 더 설득력있는 예제를 줄 수 있다면!

핸들은 아무 것도 볼 수 없다는 의미에서 불투명합니다.핸들이 void*으로 표시되는 경우 void*을 참조 해제 할 수 없으므로 오브젝트에 대한 내용을 볼 수 없습니다. 핸들이 int (코드의 다른 위치에서 정의 된 일부 배열에 대한 인덱스로 표시됨)으로 표시되는 경우 핸들 값을보고 해당 오브젝트가 나타내는 것을 알 수 없습니다.

핸들을 이해하는 유일한 방법은 핸들 유형에 적합한 방법을 사용하여 포인터 또는 참조로 변환하는 것입니다.

핸들이 void*으로 표시되는 경우 게시 한 코드는 구체적인 개체에 대한 포인터를 추출하고 개체를 이해하는 방법을 보여줍니다.

int doSomething(HANDLE s, int a, int b) { 

    // If the value of s is 3, something will be a reference 
    // to the fourth object in the array arrayOfSomethingObjects. 

    Something& something = arrayOfSomethingObjects[s]; 
    return something.doit(a, b); 
} 
+0

너무 많은 의미가 있지만, 줄을 정교하게 설명해 주시겠습니까? Something & something = arrayOfSomethingObjects [s]; 방법? 객체 유형의 배열에서 s가 3이면 3에서 참조하는 객체를보고 무언가의 유형을 무언가에 할당한다는 것을 의미합니까? –

+0

@ GENIVI-LEARNER, 대답을 약간 업데이트했습니다. 'Something &'을 사용하면 복사본이 아닌 참조를 생성하게됩니다. –

1
내가 한 사실상의 핸들에 기사 또는 구현하는 사실상의 방법이 몰랐어요

: 손잡이가 int으로 표시되는 경우

, 당신의 라인을 따라 뭔가를 볼 수 있습니다 그들. 이들은 보통 윈도우 구조이며 1985 년 일부 개발자가 구현하기로 결정한 방식으로 구현 될 수 있습니다.

정말하지 마세요 확실히 자신의 "핸들"창조의 습관을하지 마십시오

및 "리소스를 가져올 수 있습니다 꼬추를" "꼬추"만큼 의미를 가지고, 또는 오히려 Void 포인터, reinterpret_casts 및 HANDLE은 가능하면 모든 비용을 들이지 않고 피해야하는 모든 것입니다.

"핸들"을 처리해야하는 유일한 시간은 Windows API를 사용할 때입니다.이 경우 Windows API를 사용하면 문서에서 수행 할 작업을 알려줍니다.

현대 C++에서 객체를 전달하려면 참조, 포인터 및 스마트 포인터 (unique_ptr, shared_ptr, weak_ptr 포함)를 사용하고 어떤 시나리오가 필요한지 연구하십시오.

+0

헨리라는 단어는 Handle이라는 단어가 다소 혼란 스럽다는 이유를 설명합니다! 고맙습니다! –